2011-09-19 63 views
2

这些有什么不同?以下属性声明有什么区别?

  1. @interface { id value),No @property

  2. @interface { id value)@property id value;@synthesis value;

  3. @interface (/* */)id value@implementation

  4. @interface (/* */)id value@implementation

  5. 别人的,如果你觉得别人好例子

预先感谢..

+0

这是什么?它应该是代码片段? –

回答

1
  1. 没有编译器生成的访问器实例的变量。可以直接从课堂上访问,只需拆封装即可从外部访问(foo->value)。

  2. 常规类属性(=带访问器的实例变量)。可以使用访问器从课程和外部访问,可以直接从课程中访问。

  3. 如果您的意思是@implementation {id value;},这是一个私有实例变量。非常像(1),只有变量隐藏在公共头部。这是最近增加的AFAIK。

  4. 不是所有实例共享的类变量。

还有一个选择,私有类属性在实现文件中声明:

@interface YourClass() 
@property(retain) id foo; 
@end 

@implementation YourClass 
@synthesize foo; 
@end 

这给了你很好的编译器生成的访问,而无需在公众头被曝光的变量。为了包装起来,我通常使用普通属性(编号2)公开的东西和在类扩展中声明的属性(编号5)作为私人东西。

+0

3)如果变量是直接在'@ implementation'关键字后面的大括号中声明的,那么您的答案才是正确的。我对这个问题的解读是,它仅仅是@implementation块中声明的一个全局变量,并且将被视为与4)相同。无论哪种方式,你可能想澄清你在谈论哪一个。 –

+0

@BJ:谢谢,我没有意识到,我会编辑答案。 – zoul

0

这是一个实例变量(一个实例变量):

@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将被添加到属性定义中,以帮助您为循环引用释放内存。