0

我正在使用 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

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

4

3 回答 3

0

我找到了答案,但我不相信如何。实际上,最初我在 viewDidLoad 中编写了所有初始化代码,并通过传递不同的参数来简单地重用 NSInvocation 对象,因为 NSInvocation 是一个可变对象。它没有用。然后我编写了一个包含所有初始化代码的方法,并在每次使用 NSInvocation 对象时调用该方法并且它工作......

于 2010-06-14T13:49:20.080 回答
0

从您的代码中不是很清楚;但是,我看到了一些可疑的东西。希望它可以为您提供一些有用的提示。

首先,我没有看到您保留实例(从 [NSInvocation... 自动释放)。由于来自 [NSInvocation...] 的实例是自动释放的,因此您的类级别变量 myInvocation 不会在 viewDidLoad 事件之后保留它。

您的代码中的第二件事是选择器是一种自定义构造函数,以 init 开头.....我不确定您是否可以在同一实例中调用该事件。另一点是,如果要调用的 init... 方法返回 self?它应该是。

您可以使用 NSLog 函数在选择器事件中输出一些消息。NSLog 的所有消息都将在 XCode 的输出控制台中。

于 2010-06-14T16:25:17.913 回答
0

您需要提供 setArgument: 您要传递的参数的地址,而不是参数本身:

[myInvocation setArgument:&_id_ atIndex:2];

不是

[myInvocation setArgument:_id_ atIndex:2];

另外,您确定您的函数将 NSNumber 作为第一个参数吗?

于 2011-08-01T01:49:05.447 回答