Предотвращение выделения одного и того же массива более одного раза - PullRequest
0 голосов
/ 25 мая 2011

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

    indexContent = [[NSMutableArray alloc] init];

int numberOfEntries = [noteBookContent count]/3;

for (int k=0; k < numberOfEntries; k++) {
    IndexItem *newItem = [[IndexItem alloc] init];
    newItem.itemTitle = [noteBookContent objectAtIndex:(k*3)];
    newItem.itemPage = k;
    if (![[noteBookContent objectAtIndex:(k*3)] isEqualToString:@""]) {
        [indexContent addObject:newItem];
    }   
    [newItem release];
}

Что на самом деле произойдет, если indexContent = [[NSMutableArray alloc] init];называется не раз?Если это плохо, как я могу предотвратить это?Должен ли я вызвать это, например, в viewDidLoad?Но как мне поступить, если я попытаюсь выполнить «ленивую загрузку», то есть выделить только indexContent, если он мне действительно нужен?Есть ли способ проверить, был ли он уже выделен?

Извините, если все это очевидно, но я борюсь с этим.Возможно, это базовая концепция, которую я еще не полностью осознал.Спасибо!


РЕДАКТИРОВАТЬ:

У меня есть

@ свойство (неатомное, сохранить) NSMutableArray * indexContent;в моем заголовке

Ответы [ 4 ]

2 голосов
/ 25 мая 2011
if (indexContent == nil) indexContent = [NSMutableArray new]; // i screwed up logic first time.  derp.

Убедитесь, что когда вы отпускаете indexContent, вы устанавливаете его на ноль;

[indexContent release];
indexContent = nil;

(Если это не метод dealloc, но, вероятно, все еще хорошая идея)

Обратите внимание, что предполагается, что вы хотите использовать повторно и, возможно, дополнительно заполнить существующий массив. Если нет, вы можете removeAllObjects или вы можете освободить существующее и создать заново.

<Ч />

Или, если @property, вы можете:

self.indexContent = [NSMutableArray array]; // not +new!!
<Ч />

Или, в этом методе:

[indexContent release];
indexContent = [NSMutableArray new];
2 голосов
/ 25 мая 2011

Если вы вызываете свою функцию более одного раза, вы потеряете память из-за того, что вы не освобождаете уже выделенную память от предыдущего вызова. Простая проверка будет выглядеть так:

if(indexContent)
  [indexContent release]

Чтение документов по управлению памятью от Apple вам очень поможет.

1 голос
/ 26 мая 2011

Код окружения с проверкой на ноль, если он равен нулю, выделите массив

//check if it has been allocated
if(indexContent == nil)
{
    indexContent = [[NSMutableArray alloc] init];

    int numberOfEntries = [noteBookContent count]/3;

    for (int k=0; k < numberOfEntries; k++) {
        IndexItem *newItem = [[IndexItem alloc] init];
        newItem.itemTitle = [noteBookContent objectAtIndex:(k*3)];
        newItem.itemPage = k;
        if (![[noteBookContent objectAtIndex:(k*3)] isEqualToString:@""]) {
            [indexContent addObject:newItem];
        }   
        [newItem release];
    }
}
0 голосов
/ 25 мая 2011

Это зависит.Объявлен ли indexContent как сохраняющий @property?Если это так, среда выполнения позаботится об освобождении предыдущего массива.Если нет, и вы явно не освобождаете его, то да, оно будет течь.

Вы также должны убедиться, что вы выпускаете indexContext в вашем методе dealloc.

EDIT:Как упоминалось в @bbum, вам придется использовать точечную запись.self.indexContent = <whatever>; Мое плохое за то, что я упустил это из виду.

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