synthesize someString = _someString;
Это говорит о синтезировании свойства someString
, но для прямого доступа используйте _somestring
.
synthesize someString2;
Это говорит о синтезировании свойства someString2
, но для прямого доступа используйте someString2
.
Думайте об этом так, как будто компилятор генерирует iVars для вас, но в первом случае iVar называется _someString
, а второй - someString2
Это обычное явление.использование (я недавно перешел к нему), так что когда вы имеете дело с объектом напрямую (например, инициализаторами или в dealloc
, где вы не должны использовать self
), вы можете сразу увидеть, что когда вы пишете _someString = @"aString";
, выне проходят через методы свойств, которые бы применяли типы управления памятью (такие как сохранение или копирование).Обычно люди назначали значения напрямую, а затем задавались вопросом, почему они не были сохранены.
[_someString release];
[_someString2 release];
Отправляет метод release непосредственно объекту.
self.someString = nil;
self.someString2 = nil;
Отправляет релиз через собственность.В этом случае нет никакой разницы.Если бы вы выделяли объекты, разница была бы: например:
_someString = someOtherString;
Это утечка (за исключением ARC, о котором я расскажу позже), потому что вы просто добавляете новый объект всохраните, не освобождая текущий объект.
self.someString = someOtherString;
не пропускает ничего, потому что синтезированный установщик освободит текущий объект перед установкой (и сохранением) нового объекта.
Я сказал, что Iпришел в АРК.В этом случае вы все равно не можете вызвать release
, поэтому вопросов не возникает, но _someString = someOtherString
не является утечкой, потому что компилятор будет заниматься выпуском текущего объекта для вас.