Сбой приложения, вызывающий NSInvocation

#iphone #nsinvocation

#iPhone #nsinvocation

Вопрос:

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

При моей инициализации я пишу это в своем 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
  

В указанной строке происходит сбой моего приложения. Кто-нибудь, пожалуйста, может мне помочь?

Ответ №1:

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

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

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

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

Ответ №2:

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

Ответ №3:

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

 [myInvocation setArgument:amp;_id_ atIndex:2];
  

НЕ

 [myInvocation setArgument:_id_ atIndex:2];
  

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