黑马程序员----@property的参数

来源:互联网 发布:淘宝价格区间违规 编辑:程序博客网 时间:2024/05/05 20:16

------- IOS开发IOS培训、期待与您交流! -------


strongweak的区别

strong表示保留它指向的堆上的内存区域不再指向这块区域了。

也就是说我强力指向了一个区域,我们不再指向它的条件只有我们指向nil或者我自己也不在内存上,没有人strong指向我了,weak表示如果还没有人指向它了,它就会被清除内存,同时被指向nil,因为我不能读取不存在的东西。

weak只在IOS5.0使用

这并不是垃圾回收,我们用reference count表示堆上还有多少strong指针,当它变为0就马上释放。

 

本地变量都是strong,编辑器帮你计算

@property那里用的strong表示_age指针是强指针

对象一般用strong,什么时候用weak,什么时候用assign


retain

@property (retain) Book *book;如果这里加了个retain,就会重写setter方法,改为如下:


- (void)setBook:(Book *)book

{

    if (book != _book) {

    [_bookrelease];

    _book = [book retain];

    }

}

也就是说:retain:自动生成的setter方法里面,release旧值,retain新值

注:有了retain还是别忘记在dealloc里[_bookrelease];retain,谁就谁那里release



注:同一种类型的@property类型的参数只能写一个,不同类型的才可以一起写。

例如:@property (retainassign) Book *book;  这样是错误的。

@property (readwrite,readonly) Book *book; 这样也是错误的


retain:release旧值,retain新值(适用于OC对象类型)

assign:直接赋值(默认的,适用于非OC对象类型,不是对象都assign)

copy:release旧值,retain新值


是否要生成setter方法:

readwrite同时生成setter方法和getter方法的声明和实现(默认的)

readonly 只会生成getter的声明和实现


多线程:

nonatomic:性能高,告诉系统,生成setter方法时不要加多线程代码(一般用这个)

atomic       :性能低(默认的)



getter和setter

getter:决定了getter方法的名称,一定要有个冒号 :

setter :决定了setter方法的名称

@property (getter = abc,setter = abc:) Book *book;

也就是说,[p setBook:12];[p setAbc:12]这两种写法相同的,同时,p.bookp.abc也是一样的

一般用在返回BOOL类型的方法里,头文件里@property (getter = isRich) BOOL rich;在主函数中,BOOL b = p.isRich;

0 0
原创粉丝点击