iOS学习征服iOSiOS 开发每天分享优质文章

iOS中property的关键字(史上最详解)

2017-04-21  本文已影响1251人  Tamp_

昨天立了flag,今天就来开始第一篇文章吧。
property的关键字是我们平常写代码随时都会用到的,只要声明一个属性,就会用到这些关键字,先从最简单的讲起吧。

一、如何使用

property的关键字分三类:

二、关键字与内存管理

这里重点讲一下与内存管理相关的这几个关键字。
直接上代码吧

测试

@property (nonatomic,strong) Person *strongPerson;
@property (nonatomic,weak) Person *weakPerson;

试验代码

self.strongPerson = [Person new];
self.weakPerson = self.strongPerson;
self.strongPerson = nil; NSLog(@"strongStr=%@,weakStr=%@",self.strongPerson,self.weakPerson);

输出结果为:
strongStr=(null),weakStr=(null)
这里就足以说明weak修饰的属性并不会使引用计数增加

稍微修改代码,把weakPerson设置为nil

self.strongPerson = [Person new];
self.weakPerson = self.strongPerson;
self.weakPerson = nil;
NSLog(@"strongStr=%@,weakStr=%@",self.strongPerson,self.weakPerson);

输出结果如下:
strongStr=<Person: 0x600000007d50>,weakStr=(null)
说明weak修饰的属性只是对对象的弱引用,并不会真正的持有该对象。
再次修改代码

    Person *p = [Person new];
    self.strongPerson = p;
    self.weakPerson = self.strongPerson;
    p = nil;
    NSLog(@"strongStr=%@,weakStr=%@",self.strongPerson,self.weakPerson);

输出结果为:
strongStr=<Person: 0x600000200b50>,weakStr=<Person: 0x600000200b50>
这里不用多说,因为strong属性会强引用该对象并使该对象的引用计数+1,所以即使把p设置为nil,该对象也并没有释放,要想释放该对象,还得把strongStr设置为nil。
self.strongPerson = nil;
这样输出结果就是 strongStr=(null),weakStr=(null)了。

再来看看copy关键字
为了方便试验,我们直接在ViewController里面加个属性。
@property (nonatomic, copy) NSObject *c;

    NSObject *a = [[NSObject alloc]init];
    self.c = a;
    a = nil;
    NSLog(@"%@",self.c);

毫无疑问,输出结果不为nil。

    <NSObject: 0x600000010d90>

在这里要重点说一下,使用NSMutableArray,NSMutableDictionary等可变集合对象的时候千万不要用copy,这里用copy 99%会出错,因为当你给该属性赋值时它会自动调用对象的copy方法,从而将可变集合转换成不可变集合,把一个不可变集合赋值给一个可变集合,就会造成错误。

感觉写得有些啰嗦,我觉得主要是给新人看吧,毕竟我自己当初一直对这些关键字也是懵懵懂懂的,如果看了我这篇文章还是不能理解,那应该是完全不了解内存管理方面的知识,MRC、ARC应该去了解一下,如果后面有需要,我可能会写一篇相关的文章。

另外,还请大神门多多指教。。。。

更新

之前是用NSString来做的实验,但是由于字符串的特殊性,所以有点容易误导大家,现在已经全部改成了普通类了。关于字符串类型,主要是苹果在编译期做了一些优化,让它的特性跟普通变量有点类似,在这里就不说太多了,以免给大家造成困惑。

上一篇 下一篇

猜你喜欢

热点阅读