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 中创建了一个项目。

测试0.h

#import <Foundation/Foundation.h>

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

测试0.m

#import "Test0.h"

@implementation Test0
@synthesize iVar;

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

主文件

  #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->iVar = 5 我用过iVar = 5

它有什么区别?

  1. 上面提到的网页说 iVar = r; // 非法,因为我们引用了一个只读属性

iVar = 5 (我使用过的)与 iVar = r 不同吗?怎么不违法?

4

1 回答 1

4

只读属性如何工作?

编译器根本不会生成或验证 setter 的存在。它将生成 getter,并且该属性可能由 ivar 支持。同样,setter 没有在类接口中声明。

self->iVar = r;

对比

iVar = r;

它有什么区别?

没有任何。它们是相同的。它们都是 ivar 的直接赋值。this->在添加多余的范围解析(例如)时,它类似于其他语言。

不同之处在于您尝试使用 setter方法(例如self.prop = val[self setProp:val];)。在这种情况下,编译器会发出警告,运行时会抛出异常(除非您或子类自己定义了 setter)。

上面提到的网页说iVar = r; // illegal because we are referencing a readonly property.

那是错误的。如果 ivar 存在,则可以直接访问只读属性的 ivar 。在这种情况下,您看不到错误,因为您是直接访问 ivar,而不是使用 setter。


其他问题:

  • 该文章错误地指出原子是“互斥的”。
  • 该文章错误地指出原子属性保证线程安全。
于 2012-04-22T04:53:11.973 回答