我是Objective的新手。当我阅读很多教程时,@ property有一个类型的变量,同样的变量也在@inferface中声明。这需要吗?
实施例
@interface MyInterface : NSObject
{
NSInteger myVaribale;
}
@property(retain) NSInteger myVariable;
这里myVariable在这两个地方都被声明了。
答案 0 :(得分:6)
@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(属性)。