Обработка памяти Objective-C (iPhone) - PullRequest
1 голос
/ 02 марта 2010

Не могу сказать, что действительно понимаю обработку памяти в Objective-C, поэтому у меня есть пара вопросов по этому поводу.

  • Нужно ли удалять объекты "url" и "urlRequest" в поле ниже или "urlConnection" берет на себя ответственность за это?

    NSURL* url = [NSURL URLWithString:url];
    NSURLRequest* urlRequest = [[NSURLRequest alloc] initWithURL:url];
    NSURLConnection* urlConnection = [[NSURLConnection alloc] initWithRequest:urlRequest delegate:self];
    
  • В чем разница между следующими созданиями объектов. Является ли исх. счетчик сохраняется во всех случаях?

    [[NSString alloc] init];  
    [[NSString alloc] initWithFormat:...];  
    [NSString stringWithString:...];  
    
  • При назначении свойства, ссылка. Счетчик всегда сохраняется независимо от того, был ли атрибут «назначить» или «сохранить» задан как атрибут?

1 Ответ

1 голос
/ 02 марта 2010

Вообще говоря, если вы получаете объект с помощью метода, начинающего alloc, new или copy, вы несете ответственность за освобождение этого объекта. Следовательно, в вашем первом запросе вам нужно освободить urlRequest и urlConnection. Объект url является примером объекта, который вам не нужно освобождать, поскольку он создается с использованием статического фабричного метода (URLWithString).

[[NSString alloc] init];

Инициализирует строку NSSt с числом повторов 1. 1. 1004 *

[[NSString alloc] initWithFormat:...];  

Опять же, получается строка NSSt с счетом сохранения 1. Единственная разница в том, что вы назвали другой инициализатор.

[NSString stringWithString:...];

Создает автоматически освобожденную строку NSString, которая гарантированно остается действительной во время текущего цикла события.

Что касается атрибутов свойств, метод assign не будет сохранять объект, переданный в установщик.

Я знаю, что это немного сухо, но Рекомендации по управлению памятью - действительно хороший справочник для такого типа вопросов.

...