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