2011-01-12 3 views
1

У меня есть следующие строки в моем viewDidLoad:Когда выпустить NSMutableArray из цикла в 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 & Анализ, Xcode сообщает мне, что существует потенциальная утечка объекта. Но я не уверен, где я должен выпустить этот NSMutableArray, потому что я не знаю, например, имя объекта.

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

С уважением,

Рутгер

ответ

0

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

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

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).

1

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

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

Передает autoreleased пустой массив вместо:

[self.sections setValue:[NSMutableArray array] forKey:[c uppercaseString]]; 
1

Секции dict ionary собирается сохранить его, так что вы можете освободить его прямо там, как:

NSMutableArray* newArray = [[NSMutableArray alloc] init]; 
[self.sections setValue:[newArray forKey:[c uppercaseString]]; 
[newArray release]; 
Смежные вопросы