Сбой переменной экземпляра NSString - PullRequest
1 голос
/ 19 марта 2012

Я был на учебе, но я просто не понимаю. Я объявляю n-строку i-var, я устанавливаю значение в методе init, а затем, когда я получаю доступ к этому ивару в более позднем методе экземпляра, он падает или ведет себя непредсказуемо.

//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

почему он иногда падает, а не в другой раз. Почему он превращается в маллокблок? Багги NSString, или я делаю это неправильно. другие переменные работают нормально? Как я могу заставить мою NSCFString вести себя как эта NSCFConstantString. Мне больше нравится этот, потому что он не падает. Любые советы будут высоко ценится!!! спасибо!

1 Ответ

4 голосов
/ 19 марта 2012

Строка pathForResource:ofType: автоматически освобождена, что означает, что она будет выпущена «некоторое время спустя».Если вы хотите сохранить это, сохраните его:

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

И не забудьте выпустить его позже в dealloc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...