zoukankan      html  css  js  c++  java
  • 属性

    ---恢复内容开始---

    属性Objective-C 2.0定义的语法,为实例变量提供了setter

    getter⽅方法的默认实现 

     

    能在⼀一定程度上简化程序代码,并且增强实例变量的访问安全性。 

    NSString *_name;

    @property NSString *name;

    //相当于下面的两行代码

    //- (void)setName:(NSString *)name;

    //- (NSString *)name;

     

    第⼀一类:读写性控制(readonlyreadwritesettergetter)

    readonly,告诉编译器,只声明getter⽅方法(⽆无setter⽅方法)。
     例如:@property(readonly)NSString *name;

    //等价于 - (NSString *)name;

    readwrite,告诉编译器,既声明setter⼜又声明getter
     例如: @property(readwrite)NSString *name;

    //等价于 - (NSString *)name;

    - (void)setName:(NSString *)name;

    readwrite是读写性控制的默认设置。

    第⼆二类:原⼦子性控制(nonatomicatomic)

    atomicsettergetter⽅方法在多线程访问下是绝对安全的,即 settergetter内部做了多线程访问处理。原⼦子性控制的默认设置是 atomic

    nonatomicsettergetter⽅方法内部不会做多线程访问处理,仅仅是 普通的settergetter⽅方法

    程序开发过程中,settergetter处处都在⽤用,如果使⽤用atomic,需要不断 的对settergetter加锁解锁以保证线程访问安全,会很占⽤用系统资源,降低

    系统性能。 通常设置为nonatomic,某些属性需要线程安全的时候,才定义为atomic

    例如:@property (readwrite,nonatomic)NSString *name;
     //等价于

    - (NSString *)name;

    - (void)setName:(NSString *)name;

    第三类:语义设置(assignretaincopy)

    assignsettergetter内部实现是直接赋值。

    例如:@property(nonatomic,assign)NSString *name;
     - (void)setName:(NSString *)name{

    _name = name;
     }

    - (NSString *)name{
     return _name;

    }

    retainsettergetter的内部实现会做内存优化。

    例如:@property(nonatomic,retain)NSString *name;

    - (void)setName:(NSString *)name{
     if(_name != name){

    [_name release];

    _name = [name retain];
     }

    }- (NSString *)name{

    return [[_name retain]autorelease];

    } 

     

    copysettergetter的内部实现也会做内存优化。

    例如:@property(nonatomic,copy)NSString *name;

    - (void)setName:(NSString *)name{
     if(_name != name){

    [_name release];

    _name = [name copy];
     }

    }

     

    - (NSString *)name{

    return [[_name retain]autorelease];
     

     

     

    如果属性是⾮非对象类型(⽐比如int,float等)属性的语义设置使⽤用

    assign。 如果属性是对象类型(⽐比如NSStrngNSArray等)属性的语义设

    置使⽤用retain。 如果属性是对象类型并且想得到参数的copy,使⽤用copy关键字。 

     

     

    KVC

        Student *stu = [[Student alloc] init];

        [stu setValue:@"anhao" forKey:@"_name" ];

     

        NSLog(@"%@",stu.name);

     

     

    ---恢复内容结束---

    On the road。。。
  • 相关阅读:
    六白话经典算法系列 高速分拣 高速GET
    neu1458 方格取数 dp解法
    自然语言处理---新词发现---微博数据预处理2
    JQuery之初探
    TFS(Team Foundation Server)介绍和入门
    ZooKeeper的学习与应用
    软考之路(六)---数据库---深入浅出 三层模式两级映像
    Open the Lock
    C/C++产生随机数
    RPM安装包-Spec文件參数具体解释与演示样例分析
  • 原文地址:https://www.cnblogs.com/ianhao/p/4424007.html
Copyright © 2011-2022 走看看