2015-04-30 5 views
0

Я передаю цели и действия в UIButtons из значений словаря. Это отлично работает ИСКЛЮЧЕНИЕ, если я попытаюсь передать пару NSInvocation/invoke.addTarget сбой для пары NSInvocation/invoke

// |self| is a member of |MyClass|, which declares selector |test| 

NSDictionary *button1Data = @{ @"selectorString" : NSStringFromSelector(@selector(test)), 
           @"target" : self }; 

[button1 addTarget:button1Data[@"target"] 
      action:NSSelectorFromString(button1Data[@"selectorString"]) 
    forControlEvents:UIControlEventTouchUpInside]; 

// button1 executes target fine 

NSInvocation *testInvocation = [NSInvocation invocationWithMethodSignature:[MyClass instanceMethodSignatureForSelector:@selector(test)]]; 
    testInvocation.selector = @selector(test); 
    testInvocation.target = self; 
    [testInvocation retainArguments]; 

NSDictionary *button2Data = @{ @"selectorString" : NSStringFromSelector(@selector(invoke)), 
             @"target" : testInvocation }; 

[button2 addTarget:button2Data[@"target"] 
      action:NSSelectorFromString(button2Data[@"selectorString"]) 
    forControlEvents:UIControlEventTouchUpInside]; 

// button2 executes gives exceptions 

Исключения из кнопки2 не имеют регистрационных дампов.

Что я могу увидеть?

+0

Вы говорите: «отлично работает, ИСКЛЮЧАЕТ», но не говорите, как он не работает. – newacct

ответ

2

addTarget:action:forControlEvents: не сохраняет цель. Ваш объект NSInvocation создается локально внутри функции, и он будет освобожден в конце функции, если никто не будет иметь к нему ссылки. Затем кнопка отправит сообщение на освобожденный экземпляр, вызывая всевозможные плохие вещи.

+0

У этого есть грустное кольцо истины! Я сохраню NSInvocation в MyClass, если это возможно. Благодаря! – Thompson

+1

@Thompson: или вы можете добавить вызов в качестве сохраненного связанного объекта кнопки – newacct

+0

. Я дам это посмотреть, спасибо – Thompson