Objective-C ARC Должен ли конструктор устанавливать переменную экземпляра или свойство?

Возможный дубликат:
Должен ли я ссылаться на self.property в методе инициализации с помощью ARC?

Я новичок в Objective-C и все еще пытаюсь понять все, что отличается (от C # и C). Я использую ARC в своем проекте.

Скажем, у меня есть такой конструктор:

-(id)initWithPriority:(NSNumber *)x1 Value:(id)y1

и у меня есть два (сильных) (синтезированных) свойства (x2,y2). Если я сделаю:

_x2=x1;
_y2=y1;

(который пропускает просмотр свойства и просто получает доступ к синтезированным иварам), а не

x2=x1;
y2=y1;

ARC все еще работает (например, он все еще сохраняет счетчик)?


person Mr. Smith    schedule 09.11.2012    source источник
comment
Кроме того, я предполагаю, что в этом примере x2=x1; вы хотели сказать self.x2 = x1; или [self setX2:x1];.   -  person Rob    schedule 10.11.2012


Ответы (3)


ARC работает по назначению; иначе это было бы бессмысленно. (Если бы ему приходилось работать только через свойства, он ничего не добавил бы к тому, что существовало до ARC.) Так что да, если вы присваиваете значение непосредственно ivar, назначенное значение сохраняется автоматически.

И вы должны назначать напрямую ивару, если это ваш ивар, потому что во время init... ваш объект еще не полностью готов к состоянию. Таким образом, в init... выполняйте любые присваивания вашим иварам непосредственно им; не используйте аксессоры/свойства. Пример:

- (id) initWithName: (NSString*) s { 
    self = [super init]; 
    if (self) {
        self->_name = [s copy]; //
    }
    return self; }

Однако вы можете назначить свойства вашего суперкласса. Итак, если бы это был подкласс UIViewController, назначение self.title было бы в порядке.

Для полного объяснения того, как работает ARC, см. мою книгу:

http://www.apeth.com/iOSBook/ch12.html

person matt    schedule 09.11.2012
comment
@justin Это нормально, о чем свидетельствует тот факт, что Apple делает это постоянно, например. здесь (просто первый, на который я случайно наткнулся): developer.apple.com/library/ios/#samplecode/ Причина в том, что мы уже назвали super, так что аспект самих себя, который приходит из суперкласса готов. Кроме того, во многих случаях просто нет лучшего места, чем инициализатор, для установки определенных свойств суперкласса, а свойство/аксессор — ваш единственный путь. - person matt; 10.11.2012
comment
нет... это не нормально :) рассматривайте все, что суперкласс может вызывать как побочные эффекты от реализации сеттера. ссылаясь на образец/пример, который вы связали: скажем, настройка фонового представления себя добавляет представление к графу представления себя - ну, вы и ваши реализации несоставленных подклассов получите команды изменения размера и макета - все до того, как у них будет возможность инициализировать . та же проблема и побочные эффекты, которые можно увидеть здесь: .com/questions/5932677/ (продолжение) - person justin; 10.11.2012
comment
(продолжение) только в некоторых случаях вы можете доказать точные побочные эффекты вызова динамического метода, но это довольно тяжелое бремя ручного обслуживания, так что это просто плохая идея IMO. вообще безопасно? нет. мне все равно, если это из яблока. есть много возможностей для улучшения их образцов и программ, которые они предоставляют (к счастью, качество в целом улучшилось за эти годы IMO). если вы заплатите очень хорошему разработчику за проверку его примера кода, он вам об этом скажет. об этом тоже были блоги. (продолжение) - person justin; 10.11.2012
comment
(продолжение) их лучшие и умнейшие не всегда пишут пример кода, или автор может делать «ярлыки», чтобы сосредоточиться на моменте, который образец призван проиллюстрировать (часто делается в комментариях). - person justin; 10.11.2012

Вы бы установили переменную экземпляра напрямую и не использовали метод доступа. ARC выполнит подсчет ссылок.

Примечание. Вы также захотите сохранить семантику вашего свойства в реализации вашего инициализатора. Например, если бы он объявил copy, вы бы затем присвоили копию параметра ivar в инициализаторе.


Дополнительное чтение:

Должен ли я ссылаться на self.property в методе инициализации с ARC?

Инициализация свойства, запись через точку

person justin    schedule 09.11.2012

Да, вы можете назначать переменные экземпляра напрямую.

Без ARC вам нужно будет сохранить объект:

[_x1 release];
_x1 = [x1 retain];

С ARC вы можете просто присвоить переменную экземпляра:

_x1 = x1;
person Darren    schedule 09.11.2012