OC - 第八章(一) 属性

//                      第八章(一) 属性

/*    
      属性: 是为实例变量提供了setter getter 方法的默认实现
    一、属性的声明: @property
        (1)相当于@interface中声明了两个方法(setter getter)
        (2)可以不写变量定义;会自动定义下划线变量(私有变量)

    声明属性(setter getter)的时候做了三件事情;
                         一、生成私有的实例变量, _属性名
                         二、声明了setter getter方法
                         三、实现 setter getter 方法的默认实现
    @synthesize name = _name; //因此可以不写

    二、属性的实现: @synthesize
        相当于@implementation实现了setter getter 

        (1).h文件中无声明实例变量, 系统会自动添加一个私有的实例变量
        @synthesize number;//实例变量的名字就是属性名 不带下划线
        (2)@synthesize name = _hobby;用name属性(setter getter)去访问_hobby这个实例变量
        (3)@synthesize name = _age; //error!!!
        = 号左边是属性名 右端是实例变量的名字
*/

//    属性的属性(attribute):
//        第一类:读写性控制 控制提供setter 方法还是 getter 方法, 或者两者都提供
//              readwrite(默认)读写, 同时提供 setter 和 getter:
            @property (readwrite)NSString *name;
//              readonly 只提供getter方法:
            @property (readonly)NSString *name;
//              setter getter 分别指定 getter setter 方法的名字:
            @property (getter=sa,setter =wsad:)NSString *name;

//        第二类: 原子性控制
//        atomic(默认)(原子性): 在多线程中, 一条线程访问某个资源时, 不允许别的线程访问同一块资源, 通过加线程锁来实现以及解线程锁来实现, 耗费系统资源.
            @property (nonatomic, assign)NSInteger age;
//        noatomic (非原子性)

//        第三类: 语义设置: 控制setter getter方法的内部实现细节
//        assign(默认): 一般用在非对象类型
//        内部实现方法:
        @synthesize age = _age;//如果要同时重写setter getter 方法, 需要写@synthesize
        //重新系统的 setter方法
        -(void)setAge:(NSInteger)age{
            _age = age;
        }

        - (NSInteger)age{
            return _age;
        }
//        retain: 对象类型
        //retain 修饰的属性的setter getter 方法的内部实现
//        内部实现方法:
        @synthesize kill = _kill;
        - (void)setKill:(NSString *)kill{
            if (_kill != kill) {
                [_kill release];//修改BulidSetting 搜索arc OC自动参考计数
                _kill = [kill retain];//内存优化
            }
        }

        -(NSString *)kill{
            return [[_kill retain]autorelease];
        }
//        copy: 对象类型; 先得到参数的拷贝, 再赋值给实例变量
//              copy下的setter getter 方法的实现跟retain一样, 只是将实现中的retain改成了copy

        //点语法: 提供一种便捷的属性访问方式
        {
            Student *stu = [[Student alloc]init];
            [stu setName:@"黄红荫"];
            NSLog(@"%@",[stu name]);

            //调用的就是setter方法
            stu.name = @"黄飞鸿";

            //调用的就是getter方法
            NSLog(@"%@",stu.name);

            //只要满足setter getter方法的写法, 就可以使用点语法
            stu.heihei = @"嘿嘿嘿";
            NSLog(@"%@",stu.heihei);

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值