您的位置:首页 > 移动开发 > IOS开发

iOS中定义成员变量时@property(nonatomic, copy/strong/assign/weak)小结

2015-09-03 00:11 260 查看
   首先,用@property()定义一个成员变量时:1:生成一个带有下滑线的成员变量,2:生成成员变量的set和get方法

1:定义字符串为成员变量时:@property (nonatomic,
copy) NSString *str;  //可变不可变都适用

2:定义数组为成员变量时:@property (nonatomic,
strong)NSArray *array;  //可变不可变都适用

3:当使用协议和代理时,需要在协议的主动方定义一个id类型的delegate时,@property (nonatomic,
assign)  id<协议名字> delegate;

4:这个需要注意:两个类互相引用时,nonatomic后面一定要用assign 或者 weak,不然会造成内存泄露,释放不完全

 关于第4点举个例子:有个Car类,一个Person类

人有一辆车,车里做这这个人

创建车对象的时候,会有一个强指针指向车这个对象

创建人对象的时候,会有一个强指针指向人这个对象

指定这个车就是人拥有的车时,会再有一个指针指向车对象,这时车对象就有两个指针指向

当车里坐的就是这个人时,也会有一个指针指向人这个对象,这时人对象也会有两个指针指向



如果nonatomic 后面是strong的话,那么人对象和车对象都是由两个强指针指向,在arc的环境下,释放车对象,释放人对象后,车对象和人对象还会各有一个强指针指向,并且强指针都是来自于对方。这种循环引用的话就会释放不完全,造成内存泄露。

在Person这个类里定义一个Car类型的车时,nonatomic后面用assign 或者 weak的话就只是赋值,或是一个弱指针指向车对象,当释放内存时,指向车对象的强指针被释放了后就只有一个弱指针指向,也会释放。这就可以解决上述的释放不完全的情况。

同样地,在Car类里定义Person类型的人时也可以用assign或者weak。

两个类里有一个用assign或者weak就可以解决。当然两个都用也可以。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: