Когда освободить NSMutableArray из цикла в viewDidLoad? - PullRequest
1 голос
/ 12 января 2011

В моем viewDidLoad есть следующие строки:

self.sections = [[NSMutableDictionary alloc] init];

BOOL found;

// Loop through the signs and create our keys
for (NSDictionary *sign in self.allSigns)
{        
    NSString *c = [[sign objectForKey:@"name"] substringToIndex:1];

    found = NO;

    for (NSString *str in [self.sections allKeys])
    {
        if ([str isEqualToString:c])
        {
            found = YES;
        }
    }

    // If string is not found, add it in uppercase to the sections array.
    if (!found)
    {   ** Potential leak of an object.**  
        [self.sections setValue:[[NSMutableArray alloc] init] forKey:[c uppercaseString]]; 
    }
    [sign release];
}

// Loop again and sort the signs into their respective keys
for (NSDictionary *sign in self.allSigns)
{
    NSString *dummy = [[sign objectForKey:@"name"] substringToIndex:1];
    [[self.sections objectForKey:[dummy uppercaseString]] addObject:sign];
}    

// Sort each section array
for (NSString *key in [self.sections allKeys])
{
    [[self.sections objectForKey:key] sortUsingDescriptors:[NSArray arrayWithObject:[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES]]];
}    


//self.numberOfEntries = [[allSigns allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)]; 
[dataLoader release];
[super viewDidLoad];

После этого я использую массив self.sections в различных методах делегата tableview.Это также правильно объявлено в моем заголовке и (конечно) синтезировано.

Но когда я запускаю Build & Analyze, Xcode сообщает мне, что есть потенциальная утечка объекта.Но я не уверен, где я должен выпустить этот NSMutableArray, потому что я не знаю, например, имя объекта.

Должен ли я положить его в свой деллок или освободить после цикла?

С уважением,

Рутгер

Ответы [ 3 ]

1 голос
/ 12 января 2011

Словарь разделов сохранит его, поэтому вы можете опубликовать его прямо здесь, например:

NSMutableArray* newArray = [[NSMutableArray alloc] init];
[self.sections setValue:[newArray forKey:[c uppercaseString]]; 
[newArray release];
1 голос
/ 12 января 2011

Никогда передача объектов alloc-init'd непосредственно в NSDictionary:

[self.sections setValue:[[NSMutableArray alloc] init] forKey:[c uppercaseString]];

Вместо этого передайте пустой автоматически выданный пустой массив:

[self.sections setValue:[NSMutableArray array] forKey:[c uppercaseString]];
0 голосов
/ 13 января 2011

BoltClock и zpasternack предоставили два правильных ответа на ваш вопрос, но у меня есть пара советов по улучшению других областей вашего кода.

Если в словаре нет ключа, objectForKey вернет nil.Вы можете использовать это для ускорения проверки ключей.

found = ([self.sections objectForKey:c] != nil);

Вы также можете переместить добавление объектов в первый цикл и удалить второй цикл.

if(!found) {
    //add new mutable array
}
[[self.sections objectForKey:c] addObject:sign];

Есть липричина, по которой вы выпускаете знак в первом цикле?Вы не разместили его здесь, вы только что получили его из массива.

NSDictionary автоматически использует быстрое перечисление ключей, поэтому вы можете заменить for(NSString *key in [self.sections allKeys]) на for(NSString *key in self.sections).

...