我们为什么要为@property声明变量

时间:2011-01-16 17:19:00

标签: iphone objective-c

我是Objective的新手。当我阅读很多教程时,@ property有一个类型的变量,同样的变量也在@inferface中声明。这需要吗?

实施例

@interface MyInterface : NSObject
{
   NSInteger myVaribale;
}
@property(retain) NSInteger myVariable; 

这里myVariable在这两个地方都被声明了。

3 个答案:

答案 0 :(得分:6)

从iOS 4开始,你可以写

@interface MyInterface : NSObject {
}

@property(assign) NSInteger myVariable; 

@implementation MyInterface
@synthesize myVariable;
@end

意思是你可以在接口声明中省略NSInteger myVaribale,只要你在.m中合成它(合成将创建setter,getter和实例变量)

缺点是你不会在Xcode的调试器中看到myVariable的值。

答案 1 :(得分:5)

作为一个注释,如果你想将属性声明为ivar的不可变类型,那么在@property语句中重新声明ivar的类型也是有用的,例如:

@interface MyClass : NSObject
{
    NSMutableArray *myArray;
}

@property (retain) NSArray *myArray;

在这种情况下,ivar实际上存储为NSMutableArray,因此可以在对象的生命周期中进行更改。

然而,这是一个内部细节,如果你不想“广告”是可变的(可更改的),你可以使属性的类型为不可变类型 - 在本例中为NSArray

虽然这实际上不会阻止使用返回数组的其他代码变为可变,但这是一个很好的约定并且通知其他代码不应该以这种方式处理它。

答案 2 :(得分:0)

这不是一个不便,而是objc的基本概念:一个类可以有成员变量。在OOP中,您通常为成员变量定义getter和setter,这些变量应该可供外部使用。在objective-c中,我们鼓励您随时定义getter / setter(如果它们应该是私有的,则将它们的声明放入私有接口)。为简化此任务,objective-c使用的属性不超过缩写。此外还有类似键值编码和保存的内容,这些内容由属性启用,但基本上它们只是getter和setter的缩写。

结论:在@interface内部,您声明成员,外部方法包括getter / setter(属性)。