在接口中声明变量时,两者之间有什么区别:
@interface thing:NSObject {
int x;
int y;
}
@property int x, y;
2:
@interface thing:NSObject {
@public
int x;
int y;
}
答案 0 :(得分:5)
属性声明和匹配的@synthesize语句将为名为x和y的值创建标准访问器。实例变量的公开声明将允许您应用中的任何代码直接访问实例存储中的这些值。
答案 1 :(得分:2)
@public是一个访问修饰符,这意味着您可以像这样直接访问属性:
obj->someAttrib;
@property意味着编译器应该创建访问器方法(如果你正在使用@synthesize)。
重要的是,属性不一定与属性匹配。你可以像这样创建smth:
@property(readonly) int doSmth;
然后实现它:
-(int) doSmth {
return 123+456;
}
然而,这是非常粗略和不完整的解释(属性下有更多)。阅读一些关于ObjC的文章/书籍。
答案 2 :(得分:0)
默认是@protected,所以唯一的区别是你想直接访问它们,这通常被认为是不好的做法,但在第一个例子中你不能这样做:
thing * aThing = [[thing alloc] init];
aThing->x = 5;
编辑:(因为我通过回答实际问题而不是隐含问题而被投票拒绝。)
在Objective-C中有3个可见性说明符:@public
; @private
;和@protected
。
语法仅影响iVars的可见性,而不影响方法,所有方法都是公开可见的。
说明符适用于所有iVar,直到它到达另一个说明符;
@public
允许从类或子类的实例外部直接访问ivars。
@protected
允许仅在类或其子类的实例中直接访问ivars。
@private
允许从类的实例内部直接访问ivars,但不能直接访问子类。
对于@property
,它是一个使用Objective-C 2.0引入的语言结构,允许您使用.
(点)访问器来调用方法。
默认行为@property int x
将引用2种方法,具体取决于您是将其用作左手(setter)还是右手(getter)运算符,默认getter将为-(int)x;
并且默认值为setter将为-(void)setX:(int)x;
,@ property本身并不创建这些方法,但允许访问它们。
可以使用以下语法@property(getter=somethingOtherThanX,setter=somethingOtherThanSetX:)int x;