NSInvocation使应用程序崩溃

时间:2010-06-14 09:48:51

标签: 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

我的应用程序在指定的行崩溃。有人可以帮帮我吗?

3 个答案:

答案 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作为第一个参数吗?