autorelease вызвал системный сбой iOS

У меня есть метод без ARC для чтения содержимого файла plist:

-(void)readAppFile
{
    NSString *plistPath = [self getDataFileDestinationPath];
    NSData *plistXML = [[NSFileManager defaultManager] contentsAtPath:plistPath];
    NSString *errorDesc = nil;
    NSPropertyListFormat format;
    NSMutableDictionary *temp = (NSMutableDictionary *) [NSPropertyListSerialization propertyListFromData:plistXML mutabilityOption:NSPropertyListMutableContainersAndLeaves format:&format errorDescription:&errorDesc];
    if (!temp) {
        NSLog(@"Error reading plist: %@, format: %d", errorDesc, format);
    }
    items = [[temp objectForKey:@"Items"] mutableCopy];
    NSLog(@"Read file!");
}

У меня тут большая утечка памяти! Поэтому я заменяю конец кода этой строкой items = [[[temp objectForKey:@"Items"] mutableCopy] autorelease];, но теперь у меня есть Thread 1: EXC_BAD_ACCESS (code=1, addres=0x6000000008). Сегодня второй день не знаю что делать с этим методом.


person ShurupuS    schedule 09.04.2013    source источник
comment
утечка памяти, но где? plistPath, plistXML, формат, темп, элементы... какой?   -  person Anoop Vaidya    schedule 09.04.2013
comment
выпустить items, а не все objectForKey:   -  person CodaFi    schedule 09.04.2013
comment
Предметы @AnoopVaidya - это единственный объект, который я должен освободить. Но я не понимаю - что не так с авторелизом..   -  person ShurupuS    schedule 09.04.2013
comment
@CodaFi для меня сейчас довольно сложно понять, где я должен его выпустить.. Это глобальная переменная.. И я точно не знаю, как ее правильно выпустить, поэтому я попытался добавить автовыпуск.. но вылетает   -  person ShurupuS    schedule 09.04.2013
comment
попробуйте отправить release в Dealloc.   -  person Anoop Vaidya    schedule 09.04.2013
comment
@AnoopVaidya спасибо, но тут все немного сложнее, это метод класса singleton, а в этом классе 1 переменная - items, с которыми я работаю через все приложение. Но в инструментах вы можете увидеть следующее dl.dropbox.com/u/15833199/5704 .png Любые идеи, что я могу с этим сделать..   -  person ShurupuS    schedule 09.04.2013


Ответы (1)


Попробуйте явно освободить items непосредственно перед его переназначением:

if (items != nil) [items release];
items = [[temp objectForKey:@"Items"] mutableCopy];
person Jonathan Müller    schedule 09.04.2013
comment
if (items != nil) является избыточным. Отправка -release (или любым другим способом) nil всегда безопасна. - person grahamparks; 10.04.2013