2012-04-22 3 views
2

Я читаю: http://cocoacast.com/?q=node/103как делает работу только для чтения свойства

Я наткнулся на этот метод в указанной выше странице:

-(void)foo 
    { 
    self->iVar = 5; //legal because we are referencing a member variable 
iVar = r; // illegal because we are referencing a readonly property 
    }  

Затем я создал проект в Xcode.

Test0.h

#import <Foundation/Foundation.h> 

@interface Test0 : NSObject 
{ 
@private int iVar; 
} 
@property (readonly, assign) int iVar; 
- (void) foo; 
@end 

Test0.m

#import "Test0.h" 

@implementation Test0 
@synthesize iVar; 

- (void) foo 
{ 
iVar = 5; 
} 
    @end  

main.m

#import <Foundation/Foundation.h> 
    #import "Test0.h" 
    int main(int argc, const char * argv[]) 
    { 

    @autoreleasepool { 
    Test0 *t1 = [[Test0 alloc] init]; 
    [t1 foo]; 
    NSLog(@"%d", t1.iVar); 
    } 
    return 0; 
    } 

В результате в консоли 5.

Мои вопросы:

  1. Веб-страница использует упомянутые выше self-> Ивар = 5 Я использовал Ивар = 5

Что разница?

  1. На упомянутой выше веб-странице iVar = r; // незаконно, потому что мы ссылаемся на свойство readonly.

Является ли iVar = 5 (который я использовал) не такой, как iVar = r? Как это не противозаконно?

+3

Эта статья неверна. 'self-> iVar = 5' и' iVar = 5' точно такие же. 'self.iVar = 5' было бы незаконным. – ughoavgfhw

ответ

4

как работает только на работе?

Компилятор просто не генерирует и не проверяет существование сеттера. Он будет генерировать геттер, и это свойство может быть поддержано иваром. Кроме того, установщик не объявляется в интерфейсе класса.

self->iVar = r;

против

iVar = r;

Что разница?

Отсутствует. Они идентичны. Они являются прямым назначением ивара. Он похож на другие языки при добавлении избыточного разрешения области (например, this->).

Разница заключается в том, когда вы пытаетесь использовать сеттер метод (например self.prop = val или [self setProp:val];). В этом случае компилятор выдаст предупреждение, и среда выполнения вызовет исключение (если вы или подкласс не определили установщика самостоятельно).

Веб-страница уже упоминалось выше, говорит iVar = r; // illegal because we are referencing a readonly property.

Это неправильно. Прямой доступ к ivar свойства readonly является хорошим , если существует ivar. Вы не видите ошибки в этом случае, потому что вы напрямую обращаетесь к ivar, а не используете setter.


Другие вопросы:

  • В статье ошибочно указано Atomics являются 'mutexed'.
  • В статье неправильно указано, что атомные свойства гарантируют безопасность резьбы.
+0

Джастин, ваш ответ прав, но я думаю, что это будет включать в себя немного больше информации ... Его можно было бы улучшить. –

+1

@ItaiFerber, работающий над этим ... фактически просматривая связанный пост – justin

+0

Не стоит беспокоиться. Просто хотел удостовериться, что ты не оставишь это так. Поднимитесь от меня. ;) –