2010-06-14 19 views
0

我使用NSInvocation的如下:NSInvocation的製作程序崩潰

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]; 

我打電話像這樣:

在我的初始化,我在我的viewDidLoad中寫這個

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

從代碼中不是很清楚;但是,我看到一些可疑的東西。希望它可以提供一些有用的提示。

首先,我沒有看到你保留實例(自動釋放[NSInvocation ...)。由於[NSInvocation ...]中的實例是自動發佈的,因此您的類級變量myInvocation在viewDidLoad事件後不會保留它。

代碼中的第二件事是選擇器是一種自定義構造函數,以init開頭......我不確定是否可以在同一個實例中調用該事件。還有一點是,如果你的init ...方法被調用返回self?它應該是。

您可以使用NSLog函數在選擇器事件中輸出一些消息。 NSLog的所有消息都將位於XCode的輸出控制檯中。

+0

Thanx David ..它幫助.. – neha 2010-06-15 03:52:24

0

我找到了答案,但我不相信如何。實際上,最初我是在viewDidLoad中編寫所有初始化代碼,並通過傳遞不同的參數來簡單地重用NSInvocation對象,因爲NSInvocation是一個可變對象。它沒有工作。然後,我寫了一個方法,其中包含所有初始化代碼,並在每次使用NSInvocation對象時調用該方法,並且它可以工作...

0

你需要給setArgument:您傳遞的參數的地址,而不是爭論本身:

[myInvocation setArgument:&_id_ atIndex:2]; 

[myInvocation setArgument:_id_ atIndex:2]; 

另外,你確定你的函數需要一個NSNumber作爲第一個參數?