objective-c 特性

@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;