@property预编译指令的作用是自动声明属性的setter和getter方法
有时候需要声明相应的实例变量
什么时候需要声明实例变量呢?
看下面一个例子:
@interface Foo: NSObject
@property t;
@
@implmentation Foo
- (NSInteger)t
{
...
}
- (void)setT:(NSInteger)newT
{
...
}
@end
相应的setter, getter方法怎么实现呢? 这里没有用@systhesize自动合成
如果是这样的实现
- (void)setT:(NSInteger)newT
{
self.t = newT;
}
那么这个函数会一直递归调用自身,直到栈溢出。因为self.t的作用就是告诉编译器使用访问器访问name。如果使用了
裸名,编译器将假设我们直接修改了实例变量。
回到这个问题,怎么实现上面的setter呢?显然这里必须要定义一个实例变量。
上面的代码改为:
@interface Foo : NSObject
{
NSInteger t;
}
@property NSInteger t;
@end
@implementation Foo
-(void)setT:(NSInteger)newt
{
t = newt;
}
-(NSInteger)t
{
return t;
}
@end
实例变量的名称是否必须和属性名称保持一致呢?答案是否定的.
通常我们为了避免混淆, 会像下面这样定义:
@interface Foo : NSObject
{
NSInteger _t;
}
@property NSInteger t;
@end
@implementation Foo
@synthesize t=_t;
-(void)setT:(NSInteger)newt
{
_t = newt;
}
-(NSInteger)t
{
return _t;
}
@end
这样在类的内部我们用实例变量来访问.换句话说可以通过@systhesize控制生成的setter, getter方法对哪些实例变量起作用。
@systhesize t=_t1;
@systhesize t=_t2;