• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

objective-c 特性

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Objective-C 学习笔记 - part 6 - 类别与扩展发布时间:2022-07-12
下一篇:
iPhone开发入门守则:Objective-C编码规范--系列教程发布时间:2022-07-12
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap