for(NSString *collectionName in jsonObjects)
{
NSDictionary *collection = [[NSDictionary alloc] init]; // Allocation
collection = [jsonObjects valueForKey:collectionName]; // overwriting above, LEAKS
NSArray *items = [[NSArray alloc] initWithArray:[collection valueForKey:@"items"]]; // Allocation
NSNumber *lastAccess = [[NSNumber alloc] init]; // Allocation
lastAccess = [collection valueForKey:@"lastAccess"]; // overwriting above, LEAKs
[items release];
}
вызовы, которые не содержат «alloc» или «new», возвращают ссылки на объекты, которые «autoreleased», что означает, что они не принадлежат вам, освобождение их вызовет сбой.Вы можете использовать их, но только в рамках той функции, в которой находитесь, если они понадобятся вам для дальнейшего использования, вам нужно будет вызвать для них retain
.Поэтому при вызове функций доступа вам нужно только объявить нужные переменные, а не создавать новые объекты.
alloc
создает новый объект, в случае collection
вы создаете пустой NSDictionary
, но вы быстро перезаписываете ссылку на этот новый объект автоматически выпущенной ссылкой, полученной из valueForKey:
, это создаст утечку.Поскольку первоначально созданный объект не будет выпущен.
, вероятно, должен выглядеть следующим образом
for(NSString *collectionName in jsonObjects)
{
NSDictionary *collection = [jsonObjects valueForKey:collectionName];
NSArray *items = [collection valueForKey:@"items"];
NSNumber *lastAccess = [collection valueForKey:@"lastAccess"];
}
Я понимаю, что благодаря возможности получить ответы на подобные вопросы желающая толпа, читающая руководствастало просто рутиной, но если вы хотите прогрессировать, вы должны взглянуть, большая часть документации Apple исключительно хорошо написана, как эти вещи идут. Руководство по управлению памятью решит множество вопросов.