NSInvocation делает сбой приложения - PullRequest
0 голосов
/ 14 июня 2010

Я использую 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

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

Ответы [ 3 ]

0 голосов
/ 14 июня 2010

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

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

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

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

0 голосов
/ 01 августа 2011

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

[myInvocation setArgument:&_id_ atIndex:2];

НЕ

[myInvocation setArgument:_id_ atIndex:2];

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

0 голосов
/ 14 июня 2010

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

...