以下属性声明之间有什么区别?

时间:2011-09-19 05:55:49

标签: iphone objective-c ios

这些之间有什么区别?

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

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

  3. {li>

    @interface ( /* */ )id value中的@implementation

    {li>

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

  4. 其他人,如果你认为其他人的好例子

  5. 提前致谢..

2 个答案:

答案 0 :(得分:1)

  1. 没有编译器生成的访问器的实例变量。可以直接从类中访问,只能通过打破封装(foo->value)从外部访问。

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

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

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

  5. 还有一个选项,在实现文件中声明的私有类属性:

    @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,这将导致非可变版本

iOS 5.0中的

除了readOnly,原子,非原子,复制,保留,赋值等之外,新的关键字__weak将被添加到属性定义中,这有助于释放循环引用的内存。