То, что вы пропустили, это не разница в многословности, а разница в управлении памятью.
Вы часто видите такой код:
ASIHTTPRequest * requestTmp = [[[ASIHTTPRequest alloc] initWithURL:url];
self.request = requestTmp;
[requestTmp release];
Вы должны учитывать, что происходит, если свойство сохраняется, а старое освобождается в методе установки.
- Это означает, что вы создаете новый
request
, refcount равен 1.
self.request = request
, теперь, если setRequest
выглядит так:
- (void)setRequest:(ASIHTTPRequest*)aReq
{
[aReq retain];
[request release];
request = aReq;
}
Это означает, что объект сохранил requestTmp
, который вы передали, и освободил старый. Пересчет requestTmp
теперь 2.
После этого вызова вы можете освободить свой исходный requestTmp
, который вы создали, и вы в безопасности, потому что объект сохранил requestTmp
- повторный счет равен 1.
Однако, если вы сделаете это:
self.request = [[ASIHTTPRequest alloc] initWithURL:url];
[self.request release];
в итоге вы отпускаете request
, который объект retained
использует для его использования. Обратите внимание, что вы используете внутренний объект request
, в котором в исходном случае вы выпустили tmp
, но объект сохраняет свою собственную сохраненную ссылку.
Таким образом, результат отличается от исходного кода.