В чем проблема с тем, как я создаю и заполняю NSArray в Objective C? - PullRequest
4 голосов
/ 27 июля 2011

Я использую cocos2d для заполнения массива NSMutable, а затем создаю NSArray из этого массива.Я делаю следующий код 3 раза подряд с разными именами массивов, и в третий раз Instruments сообщает об утечках с каждым элементом, который я добавляю в массив.добавление CCSprite, и строки, на которые он жалуется, меняются каждый раз, когда я запускаю приложение.Что я делаю неправильно?Есть ли лучший способ сделать это?

Вот мой код:

NSMutableArray *tempNumberArray = [[NSMutableArray alloc] init];

tempSprite = [[CCSprite alloc] initWithSpriteFrameName:@"0.png"];
[tempNumberArray addObject:tempSprite];
[tempSprite release];
tempSprite = nil;


tempSprite = [[CCSprite alloc] initWithSpriteFrameName:@"0.png"];
[tempNumberArray addObject:tempSprite];
[tempSprite release];
tempSprite = nil;

tempSprite = [[CCSprite alloc] initWithSpriteFrameName:@"0.png"];
[tempNumberArray addObject:tempSprite];
[tempSprite release];
tempSprite = nil;

tempSprite = [[CCSprite alloc] initWithSpriteFrameName:@"0.png"];
[tempNumberArray addObject:tempSprite];
[tempSprite release]; 
tempSprite = nil;

self.numbersArray = [NSArray arrayWithArray:tempNumberArray];
[tempNumberArray release];
tempNumberArray = nil;

Редактировать: Спасибо, что взглянули на это.В первый раз, когда я использую tempSprite, я инициализирую его следующим образом:

CCSprite * tempSprite = [[CCSprite alloc] initWithSpriteFrameName:@"0.png"];
[tempNumberArray addObject:tempSprite];
[tempSprite release]; 
tempSprite = nil;

Я освобождаю tempSprite между каждым выделением, потому что в противном случае это будет утечка.[tempNumberArray addObject: tempSprite] сохраняет объект спрайта.

1 Ответ

1 голос
/ 28 июля 2011

Я не уверен, почему вы видите утечки.Код, который вы опубликовали, верен, хотя не обязательно каждый раз устанавливать tempSprite на nil;вам действительно нужно делать это только в том случае, если есть вероятность, что вы будете использовать указатель, чтобы попытаться сообщить объекту после его освобождения.Однако это ничего не повредит.

Единственное улучшение, которое я могу предложить, это сделать построение массива в цикле:

// You can also use an autoreleased mutable array, since you don't need it
// to stick around after construction.
NSMutableArray * tempNumbersArray = [NSMutableArray array];
int i;
for( i = 0; i < NUM_OF_SPRITES; i++ ){
    CCSprite * tempSprite = [[CCSprite alloc] initWithSpriteFrameName:@"0.png"];
    [tempNumbersArray addObject:tempSprite];
    [tempSprite release];
}

self.numbersArray = [NSArray arrayWithArray:tempNumbersArray];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...