Сам синтаксис в разработке iPhone - PullRequest
1 голос
/ 02 июня 2011

В чем разница между двумя подходами для синтаксиса self для доступа к свойствам объекта:

Подход 1: -

    self.effortView = [[EffortView alloc]initWithFrame:CGRectMake(0, 0, 320, 480)];
    self.effortView.effortTableView = [[UITableView alloc]initWithFrame:CGRectMake(25, 25, 300, 420) style:UITableViewStyleGrouped];

Подход 2: -

    effortView = [[EffortView alloc]initWithFrame:CGRectMake(0, 0, 320, 480)];
    effortView.effortTableView = [[UITableView alloc]initWithFrame:CGRectMake(25, 25, 300, 420) style:UITableViewStyleGrouped];

effortView определяется как свойство и синтезируется для класса, адресуемого как self в подход 1 . Оба подхода работают.

Я использую Xcode 4.0 iPhone SDK 4.3 на Mac 10.6.6.

Пожалуйста, просветите меня.

Спасибо всем

Ответы [ 4 ]

5 голосов
/ 02 июня 2011

В первом синтаксисе:

self.effortView = [[EffortView alloc]initWithFrame:CGRectMake(0, 0, 320, 480)];
self.effortView.effortTableView = [[UITableView alloc]initWithFrame:CGRectMake(25, 25, 300, 420) style:UITableViewStyleGrouped];

вы получаете доступ к обоим иварам через их методы доступа (обычно, effortView для получения, setEffortView для установки).

Во втором синтаксисе:

effortView = [[EffortView alloc]initWithFrame:CGRectMake(0, 0, 320, 480)];
effortView.effortTableView = [[UITableView alloc]initWithFrame:CGRectMake(25, 25, 300, 420) style:UITableViewStyleGrouped];

вы получаете доступ к effortView ivar напрямую (назначение указателя), в то время как вы обращаетесь к effortTableView через средство доступа к свойству.

Разница в том, что используя аксессор, вы получаете дополнительное поведение. Например, стандартные аксессоры set, сгенерированные ключевым словом @synthesize для свойства retain:

@property (nonatomic, retain) NSObject* property;

вы получаете автоматическое управление счетом удержания (то есть, счет удержания будет автоматически увеличиваться на назначенном объекте; если у ивара уже было значение, у объекта, на который указывает указатель, счет удержания будет уменьшен). Это означает, что в первом примере вы вызываете 2 утечки памяти. Действительно, (если свойства объявлены как retain свойство), присвоение им увеличит их количество сохраняемых данных; но [[alloc] init] уже возвращает объект с счетом сохранения 1, поэтому вам не нужно увеличивать его еще раз. Правильно будет:

self.effortView = [[[EffortView alloc]initWithFrame:CGRectMake(0, 0, 320, 480)] autorelease];
self.effortView.effortTableView = [[[UITableView alloc]initWithFrame:CGRectMake(25, 25, 300, 420) style:UITableViewStyleGrouped] autorelease];

В целом, свойства значительно облегчают работу с системой управления счетом и предлагают рекомендуемый способ ее использования, но вы должны знать об их семантике "счетчик записей" и учитывать это.

Я бы предложил эту статью в качестве интересного прочтения.

1 голос
/ 02 июня 2011

Если свойство объявлено следующим образом

@property (nonatomic, assign) EffortView *effortView;

, оба подхода эквивалентны.В случае, если свойство объявлено следующим образом

@property (nonatomic, retain) EffortView *effortView;

, код [[EffortView alloc] init...]; сначала генерирует сохраненный экземпляр EffortView, а затем «назначение» self.effortView = ... снова сохраняет этот экземпляр.Поэтому, чтобы уравновесить счет сохранения, вы должны освободить сгенерированный экземпляр.

0 голосов
/ 02 июня 2011

self.effortView использует методы доступа, сгенерированные @synthesize, для получения и установки свойства, тогда как effortView напрямую обращается к переменной экземпляра. Внутри класса, в котором определено свойство, разница наиболее важна при рассмотрении метода установки: он автоматически заботится об управлении памятью. Итак, если вы сделали это:

@property (nonatomic, retain) EffortView *effortView;

тогда два подхода имеют разные результаты. В этом случае подход 1 протекает, так как сеттер удерживает объект, а вы +alloc без сбалансированного -release.

0 голосов
/ 02 июня 2011

Первый использует методы доступа, сгенерированные оператором synthesize.

Последний обращается к переменной напрямую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...