Objective-c современная среда исполнения, использующая как свойства, так и ivars в блоке интерфейса - PullRequest
8 голосов
/ 23 мая 2011

Я видел примеры кода (из книги «Начало разработки для iPhone 4»), где они оба объявляют ivars внутри блока интерфейса, а затем объявляют свойства для того же самого.Как это:

@interface ViewController : UIViewController {
    UITableView *table;
}

@property (nonatomic, retain) IBOutlet UITableView *table;

Какова цель / выгода этого?Как я понимаю, с современной версией среды выполнения (приложения для iPhone и 64-битных OS X) вам нужно только объявить свойства и не указывать объявление ivars внутри блока интерфейса.Согласно этому ответу в потоке similair он будет использоваться для целей отладки.Но есть ли какие-либо другие преимущества, кроме отладки, которые вы могли бы использовать этот подход?

Cheers,

Peter

Ответы [ 3 ]

5 голосов
/ 23 мая 2011

Явное объявление ivars дает вам возможность использовать специальный тип для ivar внутри.

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

Пример:

@interface Foo : NSObject
@property (readonly) NSArray *bars;
@end

@implementation
{
    NSMutableArray *bars;
}

@synthesize bars;

- (void)addBar:(Bar *)bar
{
    [bars addObject:bar];
}
@end

Конечно, объект, возвращаемый из свойства bars, на самом деле не является неизменным. Но дело в том, что API не раскрывает свою изменчивость.

Обратите внимание, что я использовал новый причудливый стиль private-ivars-in-реализация. Это зависит от современной среды выполнения, а также от компилятора clang.

2 голосов
/ 23 мая 2011

Некоторым программистам нравится определять свои iVars с немного другим именем, чтобы различать прямой доступ и доступ KVC. Например:

в .ч

@interface ViewController : UIViewController {
    UITableView *_table;
}

@property (nonatomic, retain) IBOutlet UITableView *table;

и в .м

@synthesize table = _table;

таким образом, вы получаете прямой доступ к iVar с помощью _table, но вы используете синтезированные сеттеры и геттеры, используя [self table]

1 голос
/ 23 мая 2011

Но есть ли другие преимущества, кроме отладки, в которых вы бы использовали этот подход?

Я объявляю ivars явно для:

  • контроль доступа (видимость)
  • организация
  • единый письменный стиль
  • совместимость (эй, эта программа может поддерживать 32 бита в один день)
  • и поскольку я связываю свойства как часть открытого интерфейса класса (хотя исключения из этого существуют), а не просто как средство доступа к классу ivars.

«все как свойство чтения / записи» в корне неверно.

...