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

来源:互联网 发布:淘宝信用贷款在哪里查 编辑:程序博客网 时间:2024/06/05 01:06


   首先,用@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就可以解决。当然两个都用也可以。




0 0