2011-07-03 20 views
0

行,所以我有所謂的「遊戲」一類對象的代碼。每幀(60 FPS)我用獲取字符串的函數更新該對象。在運行遊戲5秒之後,我收到了發送到實例錯誤的無法識別的選擇器。發送到實例的無法識別的選擇器 - 爲什麼?

更新:

[game updatePlayersAndMonsters:@"0" monsters:@"0"]; 

功能:

-(void)updatePlayersAndMonsters:(NSString*)players monsters:(NSString*)monsters { 
    CCLOG(@"%@.%@", players, monsters); 
} 

我不明白這是怎麼回事。 錯誤:

2011-07-03 12:13:19.175 app[65708:207] -[NSCFString updatePlayersAndMonsters:monsters:]: unrecognized selector sent to instance 0xc4e95b0 
2011-07-03 12:13:19.176 app[65708:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSCFString updatePlayersAndMonsters:monsters:]: unrecognized selector sent to instance 0xc4e95b0' 

我該怎麼辦?謝謝。如果你需要其他任何細節,也可以使用IDK,所以如果我忘記了一些東西,就寫下來,我只是沒有想法。

UPDATE: GMAE是類GameNode的對象:

+(id) GmameNodeWithMapID:(int)MapID_ scene:(SomeScene*)MainScene_ players:(NSString*)Cplayers_ monsters:(NSString*)Cmonsters_ monsterCount:(NSString*)monsterCount_ 
{ 
    return [[[self alloc] GmameNodeWithMapID:MapID_ scene:MainScene_ players:Cplayers_ monsters:Cmonsters_ monsterCount:monsterCount_] autorelease]; 
} 
-(id) GmameNodeWithMapID:(int)MapID scene:(SomeScene*)MainScene players:(NSString*)Cplayers monsters:(NSString*)Cmonsters monsterCount:(NSString*)monsterCount 
{ 
    if((self=[super init])) { 

我與創建它:

game = [GameNode GmameNodeWithMapID:ChoosenMapID scene:self players:Thing[5] monsters:Thing[6] monsterCount:Thing[4]]; 

UPDATE 2

我創建SomeScene:

+(id) scene { 
    CCScene *s = [CCScene node]; 
    id node = [SomeScene node]; 
    [s addChild:node]; 
    return s; 
} 
-(id) init { 
    if((self=[super init])) { 

我使用它:

[[CCDirector sharedDirector] replaceScene: [CCTransitionRadialCW transitionWithDuration:1.0f scene:[LoginScene scene]]]; 

回答

2

'NSInvalidArgumentException', reason: '-[NSCFString updatePlayersAndMonsters:monsters:]:意味着THT你要發送updatePlayersAndMonsters一個String對象。你是否重新指派game指向其他內容?

+0

確定這確實很奇怪......嗯,我不認爲我確實,對於做noob很抱歉 - 你指的是指向其他地方的意思是什麼?謝謝! –

+0

有幾種方法可以獲得這種錯誤。其中一種方式是不加思索地做這樣的事情:'game = <某個其他對象>'。另一種方式(也許更可能是最新的更新),遊戲對象被釋放,並且用於包含遊戲對象的內存位置現在包含其他內容。 – jjwchoy

+0

xcode中的工具工具對調試這類事情非常有幫助。如果你可以在模擬器中運行它,然後嘗試使用殭屍工具運行它。此工具會告訴您何時向已發佈的對象發送消息,並且會向您顯示所有的分配/保留/發佈/自動發佈,以幫助您找到過度發佈(或保留不足)的地方 – jjwchoy

3

既然你意味着更新功能[game updatePlayersAndMonsters:@"0" monsters:@"0"];叫你的遊戲的前5秒鐘,然後你的錯誤,我的猜測是,game對象未正確保留,所以它得到釋放和連續的嘗試發送消息給它,因爲一些NSString對象已被重新使用它的存儲器(它不具有選擇器updatePlayersAndMonsters:monsters)失敗。

請分享如何game創建(分配/ INIT),它是如何存儲在你的類提供進一步的幫助。

激活NSZombies跟蹤也可以幫助診斷本。

編輯:您添加代碼

後,在我看來,在行:

game = [GameNode GmameNodeWithMapID:ChoosenMapID scene:self players:Thing[5] monsters:Thing[6] monsterCount:Thing[4]]; 

要設置一個本地變量或伊娃您自動釋放GameNode

現在,既然你沒有使用財產,我也沒有看到你的自動發行GameNode保留,我的假設似乎證實。無論是分配給保留產權:

self.game = [GameNode ...]; 

是遊戲聲明:

@property (nonatomic, retain)... 

還是做了保留自己:

game = [[GameNode GmameNodeWithMapID:ChoosenMapID scene:self players:Thing[5] monsters:Thing[6] monsterCount:Thing[4]] retain]; 
+0

已更新。謝謝。 –

+0

我試圖與殭屍,但每次它只是崩潰,然後不顯示對象或任何東西......這很奇怪..我使用Xcode 4>產品>配置文件>殭屍..它始終工作,但現在它只是簡單的崩潰,沒有更多.. –

+0

好,所以添加保留,但仍autorelease?有時候我需要刪除遊戲對象並創建一個新的遊戲對象,所以我用保留的方式完全一樣嗎?謝謝!! –

相關問題