Objective-C 【@property 中的copy关键字】
来源:互联网 发布:矩阵的用途 编辑:程序博客网 时间:2024/05/22 15:32
代码:
#import <Foundation/Foundation.h>#import "Person.h"int main(int argc, const char * argv[]) { @autoreleasepool { Person *p1=[[Person alloc]init]; NSMutableString *str1=[NSMutableString string]; str1.string=@"wang"; p1.name=str1; [str1 appendString:@" love lao"]; NSLog(@"p1.name = %@",p1.name);// 输出结果:// p1.name = wang love lao// 我们发现,我们偶然的一个操作修改了str1的值,进而影响到了p1.name的值,显然这是我们不愿看到的。这是因为p1.name和str1都指向了同一个内存空间,str1发生了改变进而影响到了p1.name。// 这也和name的set方法有关,因为我们写name的property参数的时候用的是retain /* name的set方法:(参数为 retain) -(void)setName:(NSString *)name { if(_name!=name) { [_name release]; _car=[car retain]; } } */ // 那么我们应该怎么避免呢?// 显然我们只需要将name的property参数retain改为copy即可 NSLog(@"str1 = %@",str1);// 输出结果:// p1.name = wang// str1 = wang love lao// 这样str1的改变就不会影响p1.name的改变了 // 那么,一旦参数改为copy,那么set方法就应该这样写了 /* name的set方法:(参数为 copy) -(void)setName:(NSString *)name { if(_name!=name) { [_name release]; _car=[car copy]; } } */ // 对于p1.name和str1指向的内存地址,我再详细的说明一下。原本p1.name和str1各在堆区分别指向一块内存空间,如果是copy了str1的值,那么str1会在常量区存在一个相同的值,而p1.name指向的正是常量区的那个值,而str1堆区的值再怎么变化,也是和p1.name无关的,故不会影响。 但是如果将name的property参数改为retain,那么p1.name相当于直接指向了堆区中的str1,那么str1改变就会影响p1.name了。 // copy与retain的区别:// // copy是创建一个新对象,而retain是创建一个指针使对象引用计数加1。Copy属性表示两个对象内容相同,新的对象引用计数为1 ,与旧有对象的引用计数无关,旧有对象没有变化。copy减少对象对上下文的依赖。(如果牵扯到上面程序中两个值互相影响的情况,应该用copy)//// retain属性表示两个对象地址相同(建立一个指针,指针拷贝),内容当然相同,这个对象的引用计数+1(引用计数变为2)。总结一下,retain 是指针拷贝,copy 是内容拷贝。 } return 0;}
@property 内存管理策略的选择
1、非ARC下
①copy:只用于NSString、block
②retain:除NSString、block以外的OC对象
③assign:基本数据类型、枚举、结构体(非OC对象)、当两个对象相互引用时,一端用retain,一端用assign
2、ARC下
①copy:只用于NSString、block
②strong:除NSString、block以外的OC对象
③weak:当两个对象相互引用,一端用strong,一端用weak
④assign:基本数据类型、枚举、结构体(非OC对象)
5 0
- Objective-C 【@property 中的copy关键字】
- Objective-C @property关键字
- objective-c @property关键字说明
- Objective-C中的@property
- Objective-C中的@property
- Objective-C中的@property
- Objective-C中的@property
- Objective-C中的@property
- Objective-c 的 内存管理和@property strong,weak,assign,copy,retain等关键字介绍
- Objective-c 的 @property strong,weak,assign,copy,retain等关键字介绍
- Objective-C 2.0属性(Property) retain,copy,assign,copy
- Objective-C中的关键字
- Objective-C中的@property和@synthesize用法及参数(readwrite/readonly)(assign/retain/copy)(atomicity/nonatomic)
- 谈Objective-C中的property
- Objective-C中的@Property详解
- Objective-C 【@property和@synthesize关键字】
- Objective-C 2.0属性(Property) retain和copy的区别
- Objective-C declared @property attributes (nonatomic, copy, strong, weak)
- 支付漏洞的三种常见类型
- 拓扑排序的两种实现:Kahn算法和dfs算法
- 第二周项目三(2) 汉诺塔
- 第二周 项目三-汉诺塔问题
- Serializable
- Objective-C 【@property 中的copy关键字】
- javascriptNOTE
- 二维图形变换
- c++反汇编学习笔记----------1.基本数据类型
- Sqrt(x)
- cf#320 Div.2 Problem D "Or" Game
- 【读书笔记】iOS-复制的种类
- CLSR 11.1直接寻址表
- javascript1