2010-03-20 118 views
0

好吧,我很困惑,所以我希望你的朋友能幫助我。我正在使用Cocos2D(最新版本(.99 RC 1))開展項目。我製作了一些玩家對象和一些按鈕來改變對象的生活。但奇怪的是,當我試圖改變-5的生命時,代碼崩潰。或者除此之外還有任何負值。爲什麼我的程序在給定負值時會崩潰?

直線前進,但是當NS編號爲-5時,它甚至不會被調用,它會在NSlog語句中崩潰。那麼......那是怎麼回事?

通過更好地保留變量來解決它。謝謝!

+0

將來,不要粘貼如此長的代碼段。以這種格式閱讀幾乎不可能。相反,把它放在pastebin或類似的網站並鏈接到它。 – TechZen 2010-03-20 20:28:00

回答

1

那麼,你的問題的一部分是,你沒有在任何地方使用記號「self.lifeChange」,這意味着你分配給lifeChange屬性的NSNumber對象從不保留。這意味着NSNumber對象可能隨機死亡。

更改爲self.lifeChange,看看是否有幫助。

2

好的。我會再說一遍。訪問者是你的朋友。使用它們。總是。注:是的,我知道Apple建議不要在init和dealloc中使用它們,但在15年內,它從來沒有給我造成過問題,也沒有使用它們。正如在這種情況下。有些時候,你不想使用它們,但這些時間遠遠小於時代你想使用它們)

在你buttonText方法:

- (void)buttonText:(int)number 
{ 
    lifeChange = [NSNumber numberWithInt:number]; 
    NSString *text = [[NSString alloc] initWithFormat:@"%d", number]; 
    CCLabel *label = [CCLabel labelWithString:text fontName:@"Times New Roman"          fontSize:20]; 
    label.position = CGPointMake(35, 20); 
    [self addChild:label]; 

} 

你應該做一個:

- (void)buttonText:(int)number 
{ 
    NSString *text = [[[NSString alloc] initWithFormat:@"%d", number] autorelease]; 
    CCLabel *label = [CCLabel labelWithString:text fontName:@"Times New Roman"          fontSize:20]; 

    [self setLifeChange:[NSNumber numberWithInt:number]]; 
    label.position = CGPointMake(35, 20); 
    [self addChild:label]; 

} 

看看你的代碼,瞭解alloc/copy/retain如何與release/autorelease平衡。乍一看,你真的搞亂了內存管理。

+0

這是一個很好的觀點,我會在將來確保更加謹慎。這只是一個小測試程序,所以對於真實的事情我會做得更好。謝謝! – 2010-03-20 20:44:00

+1

@Wayfarer - 良好的習慣最好由儀式使用強制執行。您在這個問題上浪費了多少時間,您可以通過遵循正確但繁瑣的程序來節省這個問題? – TechZen 2010-03-20 20:54:47

相關問題