2012-01-31 3 views
0

Может быть кто-то может объяснить разницу между свойством:Подробнее о собственности рилизинг

в файле .h

@property(nonatomic,retain) NSString *someString; 
@property(nonatomic,retain) NSString *someString2; 

в .m файл

@synthesize someString = _someString; 

или

@synthesize someString2; 

какая разница для _some String и self.someString2, используя в контроллере? и dealloc, как я должен освободить их свойство-х

[_someString release]; 

И

[self.someString2 release]; 

ИЛИ

_someString = nil; 
_someString2 = nil; 
+0

Как появился _someString2 здесь? – beryllium

ответ

1

После:

property(nonatomic,retain) NSString *someString; 
property(nonatomic,retain) NSString *someString2; 

и:

@synthesize someString = _someString; 
@synthesize someString2; 

someString является свойством при поддержке экземпляра переменной _someString. Удержание и освобождение памяти осуществляется Obj-C.

  • Отчисления в someString должны использовать форму self.someString в классе, и должны использовать <reference>.someString вне его. За исключением внутри инициализатора никогда не должно быть любых присвоений равному _someString.
  • Чтение значения может использовать только _someString в пределах класса, но self.someString также действителен и должен использовать <reference>.someString вне его.
  • Освобождение значения должно использовать форму self.someString = nil внутри класса и <reference>.someString = nil вне ее.

someString2 аналогично, за исключением его подкрепленная автоматически с именем переменной экземпляра, который случается, называется someString2.

0

_someString = nil не выпустит свою собственность.

В этом случае _someString и self._someString указывают на один и тот же объект, поэтому вы можете освободить его.

+0

не рекомендуется, однако, выпускать свойство getter! Как [self.someString release] может быть неправильным! (компилятор может генерировать autorelease getters, так что это плохая практика!) –

0
[_someString release]; 

И

[self.someString2 release]; 

релизы дважды, что это неправильно. Использовать

_someString = nil; 
_someString2 = nil; 

Правильно: либо

self.someString = nil; 
self.someString2 = nil; 

или

[_someString release]; 
[_someString2 release]; 

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

1

@synthesize someString = _someString; Это означает, что вы создаете свойство с другим именем, а затем переменную-член, с которой она связана. Это отлично. Как правило, это одно и то же имя. Вот пример, когда это не так. Таким образом, someString будет вашей собственностью, а _someString - вашей переменной-членом.

Что касается [_someString release]; и [self.someString2 release]; то, что вы видите, вызывается при вызове переменной-члена вашего класса (который является _someString). [self.someString2 release] вызывает выпуск независимо от возвращаемого свойства. Имейте в виду, что свойства могут делать больше, чем просто получить и установить. Это методы, как и любой другой, который вы можете исправить.

Кроме того, не делайте [self.someString2 release]; Вместо этого выполните self.someString2 = nil; Это освободит его от вашего имени. Таким образом, он вытесняет строку. Это защитит вас от доступа к плохой памяти, если строка фактически освобождена.

5
synthesize someString = _someString; 

Это говорит синтезировать свойство someString но для прямого доступа, используйте _somestring.

synthesize someString2; 

Это говорит синтезировать свойство someString2 но для прямого доступа, используйте someString2.

Думай о нем, как если компилятор генерации Иварс для вас, но в первом случае Ивар называется _someString и второй называется someString2

Это общее использование (я недавно переехал к нему), так что, когда вы имеете дело с объектом напрямую (например, инициализаторы или в dealloc, где вы не должны использовать self), вы можете сразу увидеть, что при написании _someString = @"aString"; вы не будете использовать методы свойств, которые применяли бы типы управления памятью (таких как сохранение или копирование). Раньше было распространено то, что люди будут напрямую присваивать ценности, а затем задаются вопросом, почему они не были сохранены.

[_someString release]; 
[_someString2 release]; 

Отправляет метод выпуска непосредственно на объект.

self.someString = nil; 
self.someString2 = nil; 

Отправляет выпуск через собственность. В этом случае нет никакой разницы. Там будет разница, если вы выделения объектов, например:

_someString = someOtherString; 

ли утечка (за исключением случаев, АРК, который я пришел позже), потому что вы просто положить в новый объект в хранилище, без освобождения текущего объекта.

self.someString = someOtherString; 

ничего не течет, потому что синтезированный сеттер выпустит текущий объект перед установкой (и удержания) новый объект.

Я сказал, что приеду в АРК. В таком случае вы не можете позвонить release в любом случае, поэтому вопросов не возникает, но _someString = someOtherString не является утечкой, потому что компилятор будет заниматься выпуском текущего объекта для вас.

+0

очень информативно, спасибо – Justin