IOS, что отличается между товарищем выделить? - PullRequest
0 голосов
/ 24 февраля 2012

method1:

NSURLConnection *conn = [[NSURLConnection alloc] initWithRequest:
                         [NSURLRequest requestWithURL:
                          [NSURL URLWithString:appRecord.imageURLString]] delegate:self];
self.imageConnection = conn;
[conn release];

method2:

self.imageConnection = [[NSURLConnection alloc] initWithRequest:
                        [NSURLRequest requestWithURL:
                         [NSURL URLWithString:appRecord.imageURLString]] delegate:self];

1 Ответ

4 голосов
/ 24 февраля 2012

Ответ: это зависит. Я предполагаю, что ваше свойство self.imageConnection настроено на сохранение.

Если у вас включен автоматический подсчет ссылок (ARC), на самом деле нет разницы (о которой вы должны знать), потому что компилятор позаботится об управлении вашей памятью за вас ... конечно, если вы Если у вас есть ARC, вы можете использовать только второй пример, который вы даете, потому что вы не можете позвонить release.

В среде, отличной от ARC, есть большая разница: первый опубликованный метод правильно освобождает память, а второй - ее.

Для объяснения, если вы объявите свойство как retain, оно, как следует из названия, сохранит его. Когда вы создаете NSURLConnection, вы выделяете / инициализируете его, который сохраняет его один раз. Затем вы присваиваете его self.imageConnection - при этом снова увеличивается счетчик сохранения.

В первом примере вы использовали временную переменную. Это означает, что после того, как вы присвоили свойству, вы можете вызвать release для «нормализации» количества сохраняемых данных. Но во втором примере у вас нет временной переменной - вы потеряли ссылку, и, присвоив ее свойству, вы сохранили ее дважды.

Решением этой проблемы является добавление оператора autorelease при назначении свойства, например:

self.imageConnection = [[NSURLConnection alloc] initWithRequest: [NSURLRequest 
                                                 requestWithURL: [NSURL URLWithString:appRecord.imageURLString]] delegate:self] 
                                                 autorelease];

... или вы можете просто сделать то, что показано в первом примере, и использовать временную переменную.

Это не относится к всем свойствам - когда вы объявляете свое свойство, вы также заявляете, хотите ли вы, чтобы оно было сохранено ('retain'), просто сохранено как указатель ('assign ') или скопировано (' copy '). Назначенное свойство не будет иметь этой проблемы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...