Ответ: это зависит. Я предполагаю, что ваше свойство 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 '). Назначенное свойство не будет иметь этой проблемы.