现在的位置: 首页 > 综合 > 正文

objective-c 特性

2012年09月05日 ⁄ 综合 ⁄ 共 850字 ⁄ 字号 评论关闭

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

抱歉!评论已关闭.