NSInvocation вызывает сбой приложения

Я использую NSInvocation следующим образом:

В моем init я пишу это в моем viewDidLoad:

SEL mySelector;
mySelector = @selector(initParsersetId:type:);

NSMethodSignature * sig = nil;
sig = [[self class] instanceMethodSignatureForSelector:mySelector];

myInvocation = nil;
myInvocation = [NSInvocation invocationWithMethodSignature:sig];
[myInvocation setTarget:self];
[myInvocation setSelector:mySelector];

И я это называю так:

Idea *tempIdea = [[Idea alloc]init];
tempIdea = [genericArray objectAtIndex:indexPath.row];
idea.ideaId = tempIdea.ideaId;
[tempIdea release];

NSNumber *_id_ = [NSNumber numberWithInt:idea.ideaId];
[myInvocation setArgument:_id_ atIndex:2];  //CRASHING AT THIS LINE

Мое приложение вылетает в указанной строке. Кто-нибудь может мне помочь?


person neha    schedule 14.06.2010    source источник


Ответы (3)


Это не очень ясно из ваших кодов; однако я вижу кое-что подозрительное. Надеюсь, это может дать вам несколько полезных советов.

Во-первых, я не вижу, что вы сохраняете экземпляр (автоматически освобождается из [NSInvocation ...). Поскольку экземпляр из [NSInvocation ...] освобождается автоматически, ваша переменная уровня класса myInvocation не сохранит его после события viewDidLoad.

Во-вторых, в ваших кодах селектор представляет собой своего рода настраиваемый конструктор, начинающийся с init ..... Я не уверен, что вы можете вызвать событие в том же экземпляре. Другой момент заключается в том, что если ваш вызываемый метод init ... возвращает self? Должен быть.

Вы можете вывести некоторые сообщения в своем событии селектора с помощью функции NSLog. Все сообщения NSLog будут в выходной консоли XCode.

person David.Chu.ca    schedule 14.06.2010

Я нашел ответ, но не уверен, как это сделать. Собственно, изначально я писал весь код инициализации в viewDidLoad и просто повторно использовал объект NSInvocation, передав ему другой аргумент, поскольку NSInvocation является изменяемым объектом. Это не сработало. Затем я написал метод со всем кодом инициализации внутри и вызывал этот метод каждый раз, когда я использовал объект NSInvocation, и он работал ...

person neha    schedule 14.06.2010

Вам нужно указать setArgument: адрес аргумента, который вы передаете, а не сам аргумент:

[myInvocation setArgument:&_id_ atIndex:2];

НЕТ

[myInvocation setArgument:_id_ atIndex:2];

Кроме того, уверены ли вы, что ваша функция принимает NSNumber в качестве первого аргумента?

person user102008    schedule 01.08.2011