我正在阅读: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。
我的问题:
它有什么不同?
iVar = 5(我用过的)和iVar = r不一样吗? 怎么不违法?
答案 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。
其他问题: