readonly属性如何工作

时间:2012-04-22 04:44:29

标签: objective-c properties

我正在阅读: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;
     }

Console中的结果是5。

我的问题:

  1. 上述网页使用 自我&gt; iVar = 5 我用过iVar = 5
  2. 它有什么不同?

    1. 上面提到的网页说 iVar = r; //非法因为我们引用了只读属性
    2. iVar = 5(我用过的)和iVar = r不一样吗? 怎么不违法?

1 个答案:

答案 0 :(得分:4)

  

readonly属性如何运作?

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

  

self->iVar = r;

     

VS

     

iVar = r;

     

它有什么不同?

无。它们完全相同。它们都是ivar的直接分配。当添加多余的范围分辨率(例如this->)时,它与其他语言类似。

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

  

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

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


其他问题:

  • 文章错误地指出原子是'互斥的'。
  • 该文章错误地指出原子属性保证线程安全。