OC 实例变量(instance var)与属性(@property)的关系

01).@property

01>.自动生成getter 和 setter 方法的声明

自动给当前类生成一个私有属性(在@implementation中),这个属性名称自带下划线
自动生成getter 和 setter 方法的实现

02>.语法格式
  @property 数据类型 去掉下划线的属性名称;

  批量生成      
  @property 数据类型 名称,名称,….;  
  注:类型必须相同
@property NSString *name,color;
03>.@property 生成的实现,没有逻辑验证
//重写
- (void)setName:(NSString *)name
{
    if(name.length < 2)
    {
        _name = @"无名";
    }
    else
    {
        _name = name;
    }
}

重写后依然会自动生成getter方法的实现

注:如果getter 和 setter 方法的实现全部重写,就不会自动生成私有属性了,需要自己写

04>.@property可以带参数
   语法格式:
   property(参数1,参数2,参数3......)数据类型 名称;
  • 可变性 (Mutability)

    readonly,只生成getter方法,没有setter方法

    readwrite,是默认的

  • 内存管理 (Memory management)

    assign,是默认的,适用于内置类型(int, bool等)或者代理对象(delegate),不存在引用计数机制。

    retain,只适用于对象,不适用内置类型(int, bool等)。当使用setter方法时,将对象的引用计数加1。

    copy,使用setter方法时,拷贝一个对象,即在内存中产生新对象,而不是把原来的对象的引用计数加1。显然,复制出来的新对象的引用计数为1。

  • 并发性 (Concurrency)

    nonatomic,访问属性非原子性,一般单线程声明nonatomic,考虑到速度问题。多线程程序就不要使用nonatomic。

    atomic,访问属性原子性,与nonatomic相反。

  • API控制 (API control)

    getter=newGetterName,指定新的getter方法名,一般重新改写BOOL实例变量的getter名。

@property(getter = isFinished)BOOL finished;

02).@synthesize

1>.自动生成getter 和 setter 方法的实现
2>.语法
  @synthesize @pro名称;
  写在@implementation里,是真私有属性
@synthesize name; //生成的私有属性是不带下划线的
03>.自动生成私有属性

解决方法 @synthesize @pro名称 = 已经存在的属性名;

@synthesize name = _name;
04>.注意
  类型不同也能批量生成
@interface HMPerson : NSObject
@property NSString *_name;
@property int _age;

@end

@implementation HMPerson
@synthesize name = _name,age = _age;

@end

03).setter和getter方法的调用

//显示调用(发送消息)
[somePerson setName:@"小明"];  //setter
[somePerson name];    //getter
//隐式调用(点语法)
somePerson.name = @"Jack";     //setter
NSString *perName = somePerson.name;    //getter
//在实例方法中直接使用实例变量
-(void)someMethod
{
  NSString *myString = _name;
  _name = @"A string";
}

显然直接使用实例变量会有风险,如内存泄露、循环引用等。最好访问实例变量,都通过@property产生的setter和getter方法。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值