2012-03-19 124 views
1

我在學習目標-c,但我不明白這一點。我聲明瞭一個nsstring i-var,我在init方法中設置了該值,然後當我在後面的實例方法中訪問該ivar時,它崩潰或行爲不可預知。NSString實例變量崩潰

//heres what my declaration looks like 
@interface StockData : CCNode { 
NSString *myPath; 
NSString *myPath2; 
} 

-(id) init 
    { 
    if ((self = [super init])){ 
     myPath = [[NSBundle mainBundle] pathForResource:@"stocks" ofType:@"sqlite"]; 
     myPath2 = @"test"; 
     CCLOG(@"mypath::::%@",[myPath class]); 
     CCLOG(@"mypath2::::%@",[myPath2 class]); 
} 
    return self; 
} 
-(void) getChunk{ 
    CCLOG(@"mypath_getchunk::::%@",[myPath class]);//this crashes 
    CCLOG(@"mypath2_getchunk::::%@", [myPath2 class]);//this doesn't 
.... 

我使用cocos2d的,而我在這樣一個計劃的更新方法調用GetChunk方法:

-(void) updateOncePerSecond:(ccTime)delta{ 
if(!sd){ 
    sd = [StockData initStockData]; 
    [self addChild:sd]; 
} 
[sd getChunk]; 
NSLog([sd getDate]); 
} 

它第一次通過迭代,我得到這樣的:

2012-03 -19 20:33:58.591 HelloWorld [6777:10a03] mypath_getchunk :::: __ NSCFString
2012-03-19 20:33:58.591 HelloWorld [6777:10a03] mypath2_getchunk :::: __ NSCFConstantString

第二次迭代了通過(如果它不崩潰):

2012-03-19 20:33:59.589的HelloWorld [6777:10a03] mypath_getchunk :::: NSMallocBlock
2012-03 -19 20:33:59.589 HelloWorld [6777:10a03] mypath2_getchunk :::: __ NSCFConstantString

爲什麼它有時會崩潰,而不是其他時間。爲什麼它變成一個mallocblock?是NSString的馬車,還是我做錯了。其他變量似乎工作正常?我如何讓我的NSCFString行爲像NSCFConstantString。我更喜歡那個,因爲它不會崩潰。任何建議將非常感謝! 謝謝!

+0

您使用ARC,垃圾回收或保留/發佈的內存管理是什麼? – Mark 2012-03-19 12:51:35

回答

4

字符串pathForResource:ofType:是autoreleased,這意味着它將在「稍後某個時間」發佈。如果你想保持它活着,保留它:

myPath = [[[NSBundle mainBundle] pathForResource:@"stocks" ofType:@"sqlite"] retain]; 

而且不要忘了在dealloc之後將其釋放。

+0

謝謝!那工作 – Danny 2012-03-19 15:06:16