zoukankan      html  css  js  c++  java
  • ObjecticeC之属性

      属性通过所谓的访问器方法,即访问信息的方法,将类变量和方法公开给外部使用(getter ,setter)。使用属性比使用手动构建的方法更有优势,包括点表示法和内存管理。

    @interface Car : NSObject
    {
        int year; //类变量
    NSString *make;
    NSString *model;
    NSArray *colors;
    }

    这样只是申明了类的变量,不是类的属性。此时不能通过点表示法来访问,即car.make是错误的。
    将上面的类变量设置为属性:

    #import <Foundation/Foundation.h>

    @interface Car : NSObject
    {
    int year;
    NSString *make;
    NSString *model;
    NSArray *colors;
    }
    @property int year; //将类变量申明为属性
    @property (retain) NSString *make;
    @property (retain) NSString *model;
    @property (retain) NSArray *colors;
    @property (readonly) NSString *carInfo;
    @end

    并且,在类实现文件中合成属性:

    @synthesize make;
    @synthesize model;
    @synthesize year;
    @synthesize colors;

    此时,点表示法和内存管理的优势就体现出来了。

    点表示法:

    [NSString stringWithFormat:@"Car Info\nMake: %@\nModel: %@\nYear: %d", self.make, self.model, self.year];

    内存管理:

    属性简化了内存管理,你可以创建在对象整个生命周期内自动保留实例变量的属性,然后当你把这些变量设为空值时就释放这些对象。

    对于属性,不要直接发送release给已保留的属性,应该如下这样的方式:

    self.make = nil;
    self.model = nil;

    属性的特性:

    readwrite 读写

    readonly  只读

    assgin     原子的

    retain      已保留的

    @property NSString *name;

    上面这种方式默认使用了assgin属性特性

    @property (retain) NSString *name;

    属性特性设为retain实现了两个功能。首先,它保留了赋值时传递的对象。其次,它在进行新的赋值之前释放以前的值。
    copy    使用它将发送一条复制的消息给被传递的对象,保留它,并释放任何以前的值。

    nonatomic  非原子性

    非原子性可以加快访问速度,但当两个竞争线程同时尝试修改同一个属性时就会出现问题。

  • 相关阅读:
    HDU5320 : Fan Li
    BZOJ3069 : [Pa2011]Hard Choice 艰难的选择
    BZOJ4227 : 城市
    BZOJ4216 : Pig
    BZOJ1171 : 大sz的游戏
    BZOJ4182 : Shopping
    BZOJ3482 : [COCI2013]hiperprostor
    BZOJ3919 : [Baltic2014]portals
    BZOJ3711 : [PA2014]Druzyny
    BZOJ1580 : [Usaco2009 Hol]Cattle Bruisers 杀手游戏
  • 原文地址:https://www.cnblogs.com/foxmin/p/2413142.html
Copyright © 2011-2022 走看看