как освободить объект, который использует ключевое слово copy в программе iOS - PullRequest
2 голосов
/ 05 июня 2011

В моей программе я пытался установить объект в словаре.Значения поступают из другого класса, поэтому я скопировал эти значения перед обработкой.

При анализе кода у меня возникли утечки.

-(void)giveInput:(NSString *)userInput ForPlaceholder:(NSString *)placeholder{

    [inputValue setObject:[userInput copy] forKey:[placeholder copy]];

}

Как освободить объект userINput и Placehoder, сохраняющий счет?

Ответы [ 3 ]

9 голосов
/ 05 июня 2011

Согласно Руководству по программированию управления памятью , вы должны release или, по крайней мере, autorelease любые ссылки, которые вы получили от alloc, new или copy.

В вашем случае попробуйте изменить [userInput copy] на [[userInput copy] autorelease]; аналогично для placeholder.

EDIT: Обратите внимание, что классы NSDictionary и NSMutableDictionary по умолчанию уже копируют ключи и сохраняют значения - для получения более подробной информации см. Руководство по программированию управления памятью, а также ссылку на класс NSMutableDictionary . Следовательно, [placeholder copy] не требуется, и если вы не хотели создавать отдельную копию userInput, нет необходимости также copy.

2 голосов
/ 05 июня 2011
-(void)giveInput:(NSString *)userInput ForPlaceholder:(NSString *)placeholder{
    NSString *cpUserInput = [userInput copy];
    NSString *cpPlaceholder = [placeholder copy];
    [inputValue setObject:cpUserInput forKey:cpPlaceholder];
    [cpUserInput release];
    [cpPlaceholder release];
}

Или в несколько строк с авто-выпуском:

[inputValue setObject:[[userInput copy] autorelease] forKey:[[placeholder copy] autorelease]];

* при добавлении объектов в словари / массивы они сохраняются

0 голосов
/ 05 июня 2011

Когда вы копируете объект, вы вступаете во владение копией.setObject:forKey: сохраняет объекты до их добавления;это означает, что вы перебрали userInput и placeholder: они никогда не будут освобождены.Чтобы устранить утечки памяти, оставьте право собственности на объекты, позвонив по номеру autorelease.

[inputValue setObject:[[userInput copy] autorelease] forKey:[[placeholder copy] autorelease]];

. Я рекомендую прочитать Руководство по программированию управления памятью от Apple .

...