Objective-C深复制和<NSCopying>协议
2012-09-20 12:31
369 查看
1.简单复制只能实现浅拷贝:指针赋值,使两个指针指向相同的一块内存空间,操作不安全。
2. Foundation类已经遵守了<NSCopying>和 <NSMutableCopying>协议,即实现了copy和mutableCopy方法,因此Foundation对象可以使用这些方法创建对象的副本或可变副本
@protocol NSCopying
- (id)copyWithZone:(NSZone *)zone;
@end
@protocol NSMutableCopying
- (id)mutableCopyWithZone:(NSZone *)zone;
@end
3.用户自定义类遵守<NSCopying>协议和<NSMutableCopying>协议,则必须实现copyWithZone方法和mutableCopyWithZone方法,否则该类对象无法响应copy和mutableCopy消息
4.实现copyWithZone方法,例:
-(id)copyWithZone:(NSZone *)zone
{
Student *stu = [[Student allocWithZone:zone]initWithName:self.name Age:self.age];
return stu;
}
对应main函数中:假设已经有一个Student对象stu1;
则:Student stu2 = [stu1 copy];
实现stu2是stu1的副本,这里是深复制,stu1和stu2分别对应不同内存。
5. 如果你的类产生了子类,那么copyWithZone:方法也将
被继承
Student *stu = [[Student allocWithZone: zone] init];
该方法应该改为: Student *stu = [[[self class]
allocWithZone: zone]init];
如果编写一个类的copyWithZone:方法那么子类的方法应该先调用父类的copy方法以复制继承来的copy实例变量.
2. Foundation类已经遵守了<NSCopying>和 <NSMutableCopying>协议,即实现了copy和mutableCopy方法,因此Foundation对象可以使用这些方法创建对象的副本或可变副本
@protocol NSCopying
- (id)copyWithZone:(NSZone *)zone;
@end
@protocol NSMutableCopying
- (id)mutableCopyWithZone:(NSZone *)zone;
@end
3.用户自定义类遵守<NSCopying>协议和<NSMutableCopying>协议,则必须实现copyWithZone方法和mutableCopyWithZone方法,否则该类对象无法响应copy和mutableCopy消息
4.实现copyWithZone方法,例:
-(id)copyWithZone:(NSZone *)zone
{
Student *stu = [[Student allocWithZone:zone]initWithName:self.name Age:self.age];
return stu;
}
对应main函数中:假设已经有一个Student对象stu1;
则:Student stu2 = [stu1 copy];
实现stu2是stu1的副本,这里是深复制,stu1和stu2分别对应不同内存。
5. 如果你的类产生了子类,那么copyWithZone:方法也将
被继承
Student *stu = [[Student allocWithZone: zone] init];
该方法应该改为: Student *stu = [[[self class]
allocWithZone: zone]init];
如果编写一个类的copyWithZone:方法那么子类的方法应该先调用父类的copy方法以复制继承来的copy实例变量.
相关文章推荐
- 复制对象(二)<NSCopying>协议和属性的copy特性
- 实现<NSCopying>协议
- Object-C中对自定义类实现<NSCopying>协议
- Object-C中对自定义类实现<NSCopying>协议
- Object-C中对自定义类实现<NSCopying>协议
- Object-C中对自定义类实现<NSCopying>协议
- mysql半同步复制<二>
- 屏蔽网站右键复制和<c-c>复制的js代码
- NSDictionary/mutabledic&<NScoding,NScopying>&archive 一点整理
- 复制控制(学习<C++Primer>)
- 常见的选择<数据源协议,委托协议>(IOS发展)
- 如何回滚请求<复制系统初始的数据>所处理的数据
- iOS基础控件-UITabBarController - 3 之<UITabBarControllerDelegate>协议中的四个重要方法
- <拦截方法> Objective-C使用Category
- 问题解决——使用串口调试助手发送控制字符 协议指令 <ESC>!?
- 【学习ios之路:Objective-C错误】Collection <__NSArrayM: 0xb550c30> was mutated while being enumerated.
- HTTP协议及其POST与GET操作差异 & C#中如何使用POST、GET等<转>
- 044.@interface <>遵守正式协议
- @protocol 协议名 <其它协议,。。>
- NSData (NSObject) <NSCopying, NSObject, NSSecureCoding, NSMutableCopying>