这些之间有什么区别?
@interface { id value )
,否@property
。
@interface { id value )
,@property id value;
和@synthesis value;
@interface ( /* */ )
,id value
中的@implementation
@interface ( /* */ )
,id value
@implementation
其他人,如果你认为其他人的好例子
提前致谢..
答案 0 :(得分:1)
没有编译器生成的访问器的实例变量。可以直接从类中访问,只能通过打破封装(foo->value
)从外部访问。
常规类属性(=带访问器的实例变量)。可以使用访问器从类和外部访问,可以直接从类中访问。
如果您的意思是@implementation {id value;}
,那么这是一个私有实例变量。非常像(1),只有变量在公共标题中隐藏。这是最近添加的AFAIK。
不是所有实例共享的类变量。
还有一个选项,在实现文件中声明的私有类属性:
@interface YourClass ()
@property(retain) id foo;
@end
@implementation YourClass
@synthesize foo;
@end
这为您提供了很好的编译器生成的访问器,而不必在公共头中公开变量。为了总结,我通常使用常规属性(数字2)来表示在类扩展(数字5)中为私有东西声明的公共东西和属性。
答案 1 :(得分:0)
这是一个实例变量(ivar):
@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;
属性是具有由编译器生成的getter和setter的iVar。通过减少样板代码并让其他类访问您类的ivars,可以节省您的时间。
iVars具有文件范围,可以从其他对象访问属性。
注意:您可以创建属性,然后指定setter,getter甚至iVar的名称。
注意:如果您使用NSMutableArray,NSMutableDictionary等,您必须自己编写setter并使用mutableCopy
否则编译器生成的setter将对新值使用copy
,这将导致非可变版本
除了readOnly,原子,非原子,复制,保留,赋值等之外,新的关键字__weak
将被添加到属性定义中,这有助于释放循环引用的内存。