разница между собственностью и общественностью - PullRequest
1 голос
/ 12 июня 2011

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

@interface thing:NSObject {
    int x;
    int y;
}
@property int x, y;

2:

@interface thing:NSObject {
    @public
    int x;
    int y;
}

Ответы [ 3 ]

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

Объявление свойства и соответствующий оператор @synthesize создадут стандартные методы доступа для значений с именами x и y. Публичное объявление переменных вашего экземпляра позволит любому коду в вашем приложении напрямую обращаться к этим значениям в хранилище вашего экземпляра.

2 голосов
/ 12 июня 2011

@ public - это модификатор доступа, который означает, что вы можете обращаться к атрибуту напрямую, например так:

obj->someAttrib;

@ property означает, что компилятор должен создавать методы доступа (если вы используете @synthesize).

Важно то, что свойство не обязательно соответствует атрибуту.Вы можете создать что-то вроде этого:

@property(readonly) int doSmth;

и затем реализовать его:

-(int) doSmth {
   return 123+456;
}

Однако это очень грубое и неполное объяснение (в свойствах гораздо больше).Прочитайте некоторые статьи / книги об ObjC.

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

по умолчанию @protected, поэтому единственное отличие состоит в том, что если вы хотите получить к ним прямой доступ, что обычно считается плохой практикой, но в первом примере вы не можете сделать это:

thing * aThing = [[thing alloc] init];
aThing->x = 5;

Редактировать: (какМне отказали, ответив на фактический вопрос, а не на подразумеваемый вопрос.)

В Objective-C есть 3 спецификатора видимости: @public;@private@protected.

Синтаксис влияет только на видимость iVars, но не на методы, все методы общедоступны.

спецификатор работает для всех последующих iVars, пока не достигнет другого спецификатора;

@public разрешает прямой доступ к иварам вне экземпляров класса или подкласса.

@protected разрешает прямой доступ к иварам только в экземплярах класса или его подклассов.

@private разрешает прямой доступ к ivars изнутри экземпляров класса, но не из подклассов.

, как и для @property, это языковая конструкция, представленная в Objective-C 2.0, которая позволяет вам использовать. (точка) метод доступа для вызова методов.

поведение по умолчанию @property int x будет ссылаться на 2 метода в зависимости от того, используете ли вы его в качестве оператора левой руки (установщик) или правой руки (получатель),получатель по умолчанию будет -(int)x;, а установщик по умолчанию будет -(void)setX:(int)x;, @property сам по себе не создает эти методы, но разрешает доступ к ним.

поведение по умолчанию может быть изменено с помощью следующего синтаксиса @property(getter=somethingOtherThanX,setter=somethingOtherThanSetX:)int x;

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