2011-01-16 5 views
1

Я новичок в Objective. Когда я прочитал много уроков, у @property есть переменная для типа, та же переменная объявлена ​​также в @inferface. Это необходимо?Почему мы должны объявлять переменные для @property

Пример

@interface MyInterface : NSObject 
{ 
    NSInteger myVaribale; 
} 
@property(retain) NSInteger myVariable; 

Здесь MyVariable объявляется в обоих месте.

ответ

6

начиная с прошивкой 4, вы можете написать

@interface MyInterface : NSObject { 
} 

@property(assign) NSInteger myVariable; 

@implementation MyInterface 
@synthesize myVariable; 
@end 

Значение вы можете опустить NSInteger myVaribale в вашем объявлении интерфейса до тех пор, как вы его синтезировать в ом (синтезирует создаст сеттер, поглотитель и переменный экземпляр)

Недостатком является то, что вы не увидите значение myVariable в отладчике Xcode.

+0

Я не знал об этом. Это довольно аккуратно. Это позор, который он не обнаруживает на отладчике. –

0

Это не является неудобством, а более простой концепцией objc: класс может иметь переменные-члены. В ООП вы обычно определяете геттер и сеттеры для переменных-членов, которые должны быть доступны снаружи. В объективе-c вам рекомендуется определять геттеры/сеттеры в любое время (если они должны быть частными, помещать их объявления в частный интерфейс). Чтобы упростить эту задачу, объект-c использует свойства, которые не превышают аббревиатуры. Кроме того, есть такие вещи, как key-value-encoding и -обслуживание, которые активируются свойствами, но в основном это просто аббревиатуры для getters и seters.

Заключение: Внутри @interface вы объявляете участников, вне методов, включая геттеры/сеттеры (свойства).

+0

Это справедливо только для 32-разрядного рабочего стола Runtime. Другие позволяют @properties также синтезировать хранилище. – bbum

5

В ноте, переопределение типу Ивара в @property заявлении также может быть полезно, если вы хотите объявить свойство как неизменного типа из Ивара, например:

@interface MyClass : NSObject 
{ 
    NSMutableArray *myArray; 
} 

@property (retain) NSArray *myArray; 

В этот экземпляр, ivar фактически хранится как NSMutableArray, поэтому его можно изменить во время жизненного цикла объекта.

Однако это внутренняя деталь, и если вы не хотите, чтобы «реклама» была изменчивой (изменяемой), вы можете сделать тип свойства неизменным типом - в этом случае NSArray.

Хотя это фактически не останавливает другой код с использованием возвращаемого массива как изменчивого, это хорошее соглашение и уведомляет другой код о том, что он не должен лечить его таким образом.

Смежные вопросы