• Objective-C中的@property和@synthesize用法


    Objective-C中的@property和@synthesize用法

    1.关键词@property和@synthesize在Obj-c中是配对使用的,用于对声明和实现的编码简化;
    eg:
    头文件(.h)中声明

    @property int personAge;

    等价于:

    -(int)personAge;
    -(void)setPersonAge:(int)age;

    文件(.m)实现

    @synthesize personAge;

    等价于:

    -(int)personAge
    {
        return personAge;    
    } 
    -(void)setPersonAge:(int)age
    {
        personAge = age;
    }

    2.声明property的语法为:@property (参数1,参数2) 类型 名字;
    eg:

    @property (readwrite,copy)NSString *personName;

    其中参数主要分为3类:
    <1>.访问器控制:(readwrite/readonly)
    <2>.内存管理:(assign/retain/copy/strong/weak/unsafe_unretained)
    <3>.原子性:(atomicity/nonatomic) 
    readwrite
    声明此属性为读写属性,即可以访问设置方法(setter),也可以访问获取方法(getter),与readonly互斥。
    readonly
    声明此属性为只读属性,只能访问此属性对应的获取方法(getter),与readwrite互斥。
    assign
    默认类型,用于值类型(int、float、double和NSInteger,CGFloat等表示单纯的复制),还包括不存在所有权关系的对象(常见的如delegate),声明在setter方法中,采用直接赋值来实现设值操作。eg:

    -(void)setPersonName:(NSString *)name
    {
        personName = name;
    }

    retain
    意味着实例变量要获取传入参数的所有权,声明在setter方法中,需要对设过来的值进行retain 加1操作。eg:

    -(void)setPersonName:(NSString *)name
    {    
        if (personName != name)
       {
            [personName release];
            personName = [name retain];
        }
        personName = name;
    }

    copy
    调用此实例的copy方法,设置克隆后的对象。实现参考retain。 
    strong
    是在ARC伴随IOS引入的时候引入的关键字是retain的一个可选的替代。表示实例变量对传入的参数要有所有权关系即强引用。strong跟retain的意思相同并产生相同的代码,但是语意上更好更能体现对象的关系。
    weak
    与assign的效果相似,不同的是weak在对象被回收之后自动设置为nil。而且weak智能用在iOS 5或以后的版本,对于之前的版本,使用unsafe_unretained。
    unsafe_unretained
    weak的低版本替代。
    nonatomic
    在默认的情况下,通过synthesized 实现的 setter与getter都是原子性访问的。
    多线程同时访问时,保障访问方法同时只被访问一个线程访问,eg:

    [ _internal lock ]; // lock using an object-level lock  
    id result = [ [ value retain ] autorelease ];  
    [ _internal unlock ];  
    return result;  

    但如果设置nonatomic时,属性的访问为非原子性访问,但访问速度比atomic快,在单线程和明确只有一个线程访问的情况下广泛使用。

    3.@synthesize
    对于下面的@propety 

    @property (nonatomic, copy) NSString *personName; 

    默认合成的规则为:

    @synthesize personName = _personName;

    其中_personName是编译器自动帮我们创建的;
    @synthesize 中也可以定义 与变量名不相同的getter和setter的命名,籍此来保护变量不会被不恰当的访问。

  • 相关阅读:
    逆元(费马小定理求法)
    CodeForces
    lower_bound and upper_bound
    HDU 4825 Xor Sum
    1030: [JSOI2007]文本生成器
    1070: [SCOI2007]修车
    agc 027 B
    P2664 树上游戏
    CF 314 E. Sereja and Squares
    4237: 稻草人
  • 原文地址:https://www.cnblogs.com/sz-leez/p/4451485.html
Copyright © 2020-2023  润新知