我使用NSInvocation的方法如下:
在我的init中,我在我的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我的应用程序在指定的行处崩溃。有谁能帮帮我吗?
发布于 2010-06-15 00:25:18
从您的代码中看不是很清楚;但是,我看到了一些可疑的东西。希望它能为您提供一些有用的提示。
首先,我没有看到您保留实例(自动从[NSInvocation释放...)。由于来自NSInvocation的实例...是自动释放的,那么在viewDidLoad事件之后,您的类级变量myInvocation将不会保留它。
代码中的第二件事是选择器是一种定制的构造函数,以init开头……我不确定您是否可以在同一实例中调用该事件。另一点是,如果你的初始化...要调用的方法返回self吗?应该是这样的。
您可以使用NSLog函数在选择器事件中输出一些消息。来自NSLog的所有消息都将出现在您的XCode的输出控制台中。
发布于 2010-06-14 21:49:20
我已经找到了答案,但我不确定是怎么回事。实际上,最初我是用viewDidLoad编写所有初始化代码,并通过传递不同的参数来重用NSInvocation对象,因为NSInvocation是一个可变对象。它没有起作用。然后,我编写了一个包含所有初始化代码的方法,并在每次使用NSInvocation对象时调用该方法,它起作用了……
发布于 2011-08-01 09:49:05
您需要提供setArgument:要传递的参数的地址,而不是参数本身:
[myInvocation setArgument:&_id_ atIndex:2];不
[myInvocation setArgument:_id_ atIndex:2];另外,你确定你的函数以NSNumber作为第一个参数吗?
https://stackoverflow.com/questions/3036264
复制相似问题