为什么协议可以有@property而不是iVar?

时间:2015-08-27 08:25:46

标签: ios objective-c

我在某处读到“property实际上只是get / set方法,它不需要支持变量”。那是真的吗? 如果属性存储其值

,则为true

2 个答案:

答案 0 :(得分:1)

属性是方法声明。期。这就是为什么你可以在协议中使用它们。

但是Q的基础导致属性和合成,而不是协议:

如果没有连接的ivar,则通过在实现中合成属性来创建支持ivar。由于我们有自动合成,你没有看到合成。但它仍然存在。

所以,像这样的源代码

@interface MyClass : NSObject
@property id prop;
@end

@implementation MyClass
@end

默默地添加这样的东西。 (它不完全相同,但差不多。)

@interface MyClass : NSObject
@property id prop;
@end

@implementation MyClass
@synthesize prop;
@end

如果您手动实现声明属性的访问器,则可以检查:

@interface MyClass : NSObject
@property id prop;
@end

@implementation MyClass
- (id)prop { … };
- (void)setProp:(id)prop { … };
@end

在这种情况下,关闭自动合成并且没有声明ivar。

因此,如果ivars是 implementation 的问题,协议就无法声明它们。它们是一种接口定义。

答案 1 :(得分:-2)

当您将该协议实现为类的一部分时,该类将合成底层实例变量。正如您所知,该协议只是一个声明。