ObjectiveC: где объявлять свойства частных экземпляров?

У меня есть следующий интерфейс класса:

@interface MyClass : NSObject

@property int publicProperty;

@end

то реализация:

@interface MyClass() // class extension

- (void)privateMethod; // private methods

@end

@implementation MyClass {
    int _privateProperty;
}

@property int privateProperty = _privateProperty;

@end

это то, что показал парень Apple в WWDC, но есть ли причина, по которой NOT класть _privateProperty в расширение класса, например:

@interface MyClass() // class extension
{
    int _privateProperty;
}

- (void)privateMethod; // private methods

@end

Спасибо!

Ответ 1

Вам не нужно объявлять свои ivars как в интерфейсе, так и в реализации. Поскольку вы хотите сделать их частными, вы можете просто объявить их в файле реализации следующим образом:

@implementation {

int firstVariable;
int secondVariable;
...
}
//properties and code for  your methods

Если вы этого захотите, вы можете создать методы getter и setter, чтобы вы могли получить доступ к этим переменным.

Человек, с которым вы говорили, был прав, подумал, что нет никаких причин, по которым вы НЕ объявляете их одинаково в интерфейсе. Некоторые книги на самом деле учат вас, что @interface показывает публичное лицо класса, а то, что у вас есть в реализации, будет закрытым.

Ответ 2

Я обычно "принудительно" закрываю с расширением в реализации

В заголовке

@interface MyClass : NSObject
{
}

@property (nonatomic, assign) int publicProperty;

@end

В вашем файле реализации:

@interface MyClass ()
@property (nonatomic, assign) int privateProperty;
@end


@implementation MyClass
@synthesize privateProperty;
@synthesize publicProperty;

@end

Ответ 3

Вы хотите, чтобы вы объявляли частные переменные экземпляра?

Вы можете сделать это:

@interface MyClass()
{
 @private //makes the following ivar private
   int _privateProperty;
}

Ответ 4

С помощью "современной среды исполнения" (64-разрядной версии MacOS после 10.5 и всех версий iOS) вам не нужно вообще объявлять переменные экземпляра.

// MyClass.h
@interface MyClass : NSObject

@property int publicProperty;

@end


// MyClass.m
@implementation MyClass

@synthesize publicProperty = _privateProperty;  // int _privateProperty is automatically synthesized for you.

@end