解析Obj-C中的assgin,copy,retain关键字的含义。
来源:互联网 发布:ubuntu 14.04 qq 2015 编辑:程序博客网 时间:2024/06/05 08:38
在objc中引入了引用计数的概念Reference counting,当一个对象的计数为0时由系统负责释放对象的内存,每多一次对象引用计数就会加1.
retain:对一个对象引用加1
relese:引用减1
assign:对于非NSObject类型的对象赋值通常采用assign(简单赋值,不更改计数)例如:NSInteger,float,double,char等。
【ARC】
ARC自动引用计数:引入了新的对象生命周期限定(零弱引用:计数为0时自动设置为nil,防止了野指针),新加了strong和weak关键字。strong代替retain,weak代替assign。
weak声明一个当对象消失后指针可以自动设置为nil的对象。
readonly:表示对象是只读的,即仅实现getter操作。
readwrite:可供访问getter,setter
注:self.name=@"hello"和name="hello"的区别是:
1.self.name调用了setName方法,引用会加1.
2.name是直接赋值,引用不变
nonatomic:非原子操作(原子操作主要用在线程之间同步,原子操作是不可拆分的)
atomic:原子操作
【浅拷贝/深拷贝】
copy:对象拷贝,建立一个相同的对象,旧对象不变。不同的地址,但是数据相同,初始计数为1。
mutablecopy:同样是拷贝,只不过复制的是mutable类型的对象例如:NSMutableString。
具体区别:
1.对于非容器类对象:NSString等。
copy是浅拷贝,只复制指针,地址不变(浅拷贝)。mutablecopy是真正的内存复制(深拷贝)。
2.对于容器类对象:NSMutableString等
copy和mutablecopy都是内存复制(深拷贝),但是copy出来的对象不可增加。
但是对于NSArray和NSMutableArray对象来说,copy和mutablecopy都只是复制Array对象,但是对于Array内的内容对象来说并没有复制内存。如果要想实现NSMutableArray的完全拷贝就要用下面的代码,看例子:
NSArray *array = [[NSArray alloc]initWithObjects:[NSMutableString stringWithString:@"one1"],@"two2"];
NSArray *arrayCopy = [[NSArray alloc]initWithArray:array copyItems:YES];
NSArray *arrayDeepCopy = [NSKeyedUnarchiver unarchiveObjectWithData:[NSKeyedArchiver archivedDataWithRootObject:array]];
对于arrayCopy而言:@“one1”是内存赋值了,可@“two2”却没有内存赋值还是指针拷贝。只有arrayDeepCopy才是真正的完全内存复制。新的arryDeepCopy内的所有内容对象都是新的内存。
》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》》
另一个问题:如何对自定义的对象使用copy和mutablecopy呢?
答:只用自己实现:copyWithZone或mutableCopyWithZone函数就可以使用copy或mutableCopy了。
@interface MyObj : NSObject<NSCopying,NSMutableCopying>{ NSMutableString *name; NSString *imutableStr; int age;}@property (nonatomic, retain) NSMutableString *name;@property (nonatomic, retain) NSString *imutableStr;@property (nonatomic) int age;@end@implementation MyObj@synthesize name;@synthesize age;@synthesize imutableStr;- (id)init{ if (self = [super init]) { self.name = [[NSMutableString alloc]init]; self.imutableStr = [[NSString alloc]init]; age = -1; } return self;}- (void)dealloc{ [name release]; [imutableStr release]; [super dealloc];}- (id)copyWithZone:(NSZone *)zone{ MyObj *copy = [[[self class] allocWithZone:zone] init]; copy->name = [name copy]; copy->imutableStr = [imutableStr copy];// copy->name = [name copyWithZone:zone];;// copy->imutableStr = [name copyWithZone:zone];// copy->age = age; return copy;}- (id)mutableCopyWithZone:(NSZone *)zone{ MyObj *copy = NSCopyObject(self, 0, zone); copy->name = [self.name mutableCopy]; copy->age = age; return copy;}
- 解析Obj-C中的assgin,copy,retain关键字的含义。
- OBJ-C中的retain,copy,assign的区别
- assgin ,copy,retain
- objective-C: retain copy assgin 等属性详解
- objective-C: nonatomic retain copy assgin 等属性详解
- Objective-C中copy 、retain以及ARC中新加入的strong、weak关键字的含义
- Objective-C中copy 、retain以及ARC中新加入的strong、weak关键字的含义
- Objective-C中copy 、retain以及ARC中新加入的strong、weak关键字的含义
- Objective-C中copy 、retain以及ARC中新加入的strong、weak关键字的含义
- 对不同类型assgin,retain,和copy内部实现的方法
- iOS中assign、copy 、retain等关键字的含义
- iOS中assign、copy 、retain等关键字的含义
- iOS中assign、copy 、retain等关键字的含义
- iOS中assign、copy 、retain等关键字的含义
- iOS中assign、copy 、retain等关键字的含义
- iOS中assign、copy 、retain等关键字的含义
- iOS中assign、copy 、retain关键字的含义
- iOS中assign、copy 、retain等关键字的含义
- 巧妇能为少米之炊(1)——Android下小内存下的生存之道
- LA4329
- Android回顾之静默安装
- Android的framework层音量控制原理分析--hot(key)处理
- 好文分享
- 解析Obj-C中的assgin,copy,retain关键字的含义。
- 七(7.6 ) 线程的执行时间
- OCX控件包装类的生成
- 使用TabHost实现卡片选项菜单
- 抑郁症患者的陈述
- 解决WordPress主题缺少style.css无法安装的方法
- Eclipse下NDK开发(java调用so文件)
- Linux下spi驱动开发
- 深入了解信号槽