objective-c感悟(三)属性之谜

来源:互联网 发布:2016加入淘宝客的条件 编辑:程序博客网 时间:2024/05/21 11:04
@property (readwrite, assign, setter=setCity:, getter=getCity)NSString *city;@property (copy)NSString *name;@property (retain)ARC *arc;

上面代码是oc的属性以及一些属性修饰符,oc跟c++区别这里挺大的,它提供了好多的操作的封装,一个@property在c++里要码几行代码了,但是也挺高了知识复杂度,需要仔细研究下。

@property是属性指示符,我们可以像下面一下声明属性arc,默认属性修饰符是assign与readwrite。而属性city跟name我们省略了实例变量的声明,@property可以帮我们自动生成。

@interface property : NSObject{    ARC * arc;}//@property NSString *name;@property (readwrite, assign, setter=setCity:, getter=getCity)NSString *city;@property (copy)NSString *name;@property (retain)ARC *arc;

在实现里用@synthesize是合成属性的setter与getter方法。

@synthesize name;@synthesize city;@synthesize arc;
我们在c++里一般像下面一样创建setter与getter方法,在oc里面只需要写@property m_name与@synthesize m_name就可以了。

class CC{private:    char m_name[20];public:    const char* getName()const{        return m_name;    }        void setName(const char *name){        strcpy(m_name, name);    }};

默认@property 的修饰是readwrite与assign,readwrite表示可读写,会帮我们生成这两个方法,如果只要生成getter,可以设置@property(readonly) m_name,表示只读。copy跟retain两个修饰用于指针的,基本类型跟结构不需要去设置。我们知道在c++中下面两个操作,一个是赋值操作,一个是拷贝构造,c++里分的很清楚,因为我们可以对对象解引用,然后赋值。而oc是扩展c的也可以解引用,但是不能对类对象赋值,那是c++类中定义的赋值操作,编译器帮我们合成的,我们也可以手动定义。

    CC *person1 = new CC;    CC *person2 = new CC;    *person1 = *person2; //assigment    CC person3 = *person2; //copy

oc里我们拷贝一个对象到另一个对象,其实就是把一个对象copy下,然后赋值给另一个对象指针,而不是重写另一个对象内存数据,就想下面一样

    ARC * a = [[ARC alloc] init];    ARC * b = [[ARC alloc] init];    a = [b copy];

那么oc里我们怎么把一个对象赋值给另一个对象,而不是赋值对象指针呢。我们发现了有copy跟assign两个属性修饰符,后者是默认的,就是指针直接传值,而不是传的指针所指对象。copy就是用来解决我们上面问题的,会把对象内存拷一份副本过来覆盖原来内存数据。对于那些我们想要拷贝的属性,比如NSString类型的,A不想跟B发生联系,不想被B的改变而改变的,就用copy,如果唯一,单例就用assign,这是默认的,我们无需手动指定

最后说下retain,它会让属性的应该计数加一,关闭arc测试发现不管getter,还是setter都会导致计数加一,而NSString计数是-1。






0 0