#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 в качестве первого аргумента?