这些有什么不同?以下属性声明有什么区别?
@interface { id value)
,No@property
。@interface { id value)
,@property id value;
和@synthesis value;
@interface (/* */)
,id value
在@implementation
@interface (/* */)
,id value
了@implementation
别人的,如果你觉得别人好例子
预先感谢..
这些有什么不同?以下属性声明有什么区别?
@interface { id value)
,No @property
。
@interface { id value)
,@property id value;
和@synthesis value;
@interface (/* */)
,id value
在@implementation
@interface (/* */)
,id value
了@implementation
别人的,如果你觉得别人好例子
预先感谢..
没有编译器生成的访问器实例的变量。可以直接从课堂上访问,只需拆封装即可从外部访问(foo->value
)。
常规类属性(=带访问器的实例变量)。可以使用访问器从课程和外部访问,可以直接从课程中访问。
如果您的意思是@implementation {id value;}
,这是一个私有实例变量。非常像(1),只有变量隐藏在公共头部。这是最近增加的AFAIK。
不是所有实例共享的类变量。
还有一个选择,私有类属性在实现文件中声明:
@interface YourClass()
@property(retain) id foo;
@end
@implementation YourClass
@synthesize foo;
@end
这给了你很好的编译器生成的访问,而无需在公众头被曝光的变量。为了包装起来,我通常使用普通属性(编号2)公开的东西和在类扩展中声明的属性(编号5)作为私人东西。
3)如果变量是直接在'@ implementation'关键字后面的大括号中声明的,那么您的答案才是正确的。我对这个问题的解读是,它仅仅是@implementation块中声明的一个全局变量,并且将被视为与4)相同。无论哪种方式,你可能想澄清你在谈论哪一个。 –
@BJ:谢谢,我没有意识到,我会编辑答案。 – zoul
这是一个实例变量(一个实例变量):
@interface sampleClass : superclass
{
NSUInteger sampleIvar;
}
这是私人的Ivar:
@interface sampleClass : superclass
{
@private
NSUInteger sampleIvar;
}
这是一个属性:
@property (nonatomic,copy) NSString *sampleCopiedProperty;
@property (atomic,copy) NSString *sampleAtomicCopiedProperty;
@property (nonatomic,retain) yourClass *sampleRetainProperty;
@property (nonatomic,assign) BOOL sampleAssignProperty;
属性是IVARS那让他们的getter和setter由编译器生成。属性通过减少样板代码为您节省时间,并让其他类访问您班级的ivars。
iVars具有文件范围,可以从其他对象访问属性。
注意:您可以创建属性,然后指定setter,getter和iVar的名称。
注意:如果您使用NSMutableArray,NSMutableDictionary等,您必须亲自编写setter,并使用mutableCopy
,否则编译器生成的setter将对新值使用copy
,这将导致不可变的版本。
在iOS 5.0中,除了readOnly,atomic,nonatomic,copy,retain,assign等之外,新的关键字__weak
将被添加到属性定义中,以帮助您为循环引用释放内存。
这是什么?它应该是代码片段? –