我正在使用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
我的应用程序在指定的行崩溃。有人可以帮帮我吗?
答案 0 :(得分:0)
我找到了答案,但我不相信如何。实际上,最初我在viewDidLoad中编写了所有初始化代码,并且只是通过传递不同的参数来重用NSInvocation对象,因为NSInvocation是一个可变对象。它没用。然后我编写了一个包含所有初始化代码的方法,并在每次使用NSInvocation对象时调用该方法并且它有效...
答案 1 :(得分:0)
你的代码不是很清楚;但是,我看到一些可疑的东西。希望它可以提供一些有用的提示。
首先,我没有看到你保留实例(从[NSInvocation ...]自动释放)。由于[NSInvocation ...]中的实例是自动释放的,因此您的类级别变量myInvocation在viewDidLoad事件之后不会保留它。
你的代码中的第二件事是选择器是一种自定义的构造函数,以init开头.....我不确定你是否可以在同一个实例中调用该事件。另一点是,如果你要调用的init ...方法返回self?它应该是。
您可以使用NSLog函数在选择器事件中输出一些消息。 NSLog的所有消息都将在您的XCode输出控制台中。
答案 2 :(得分:0)
你需要给setArgument:你传递的参数的地址,而不是参数本身:
[myInvocation setArgument:&_id_ atIndex:2];
不是
[myInvocation setArgument:_id_ atIndex:2];
另外,你确定你的函数将NSNumber作为第一个参数吗?