OC——copy语法的基本使用
来源:互联网 发布:mac下载汉仪颜体 编辑:程序博客网 时间:2024/05/01 00:21
Copy语法
Oc中的Copy和mutableCopy方法:
Copy-需要先实现NSCopying协议,创建的是不可变的副本(如NSString、NSArray、NSDictionary)。
MutableCopy-需要实现NSMutableCopying协议,创建的是可变的副本 。
Tip:①copy语法的目的是产生一个副本使得改变副本时不会影响源对象。
②使用copy时要注意内存的管理。
MutableCopy和Copy的使用情况如下表所示:
源对象
调用的方法
获得的对象
NSArray
Copy
NSArray
NSMutableArray
Mutable
NSMutableArray
NSDictionary
Copy
NSDictionary
NSMutableDictionary
Mutable
NSArrayDictionary
NSString
Copy
NSString
NSMutableString
Mutable
NSMutableString
拷贝时可以分为以下两种情况:
深拷贝(内容拷贝):产生了新的对象,新对象的计数器置为1,源对象计数器不变。
浅拷贝(指针/地址拷贝):没有产生新的对象 ,只是将源对象的计数器+1,
Tip:当不可变的对象调用copy方法才是浅拷贝如下面的三种copy方式
源对象
调用的方法
获得的对象
NSArray
Copy
NSArray
NSDictionary
Copy
NSDictionary
NSString
Copy
NSString
当想用自己的类使用copy语法时需要遵守NSCopying或NSMutableCopying协议并在.m文件中实现该协议
例如:Student的姓名拷贝
.h文件的内容:
@interface Student :NSObject <NSCopying>
// copy代表set方法会release旧对象、copy新对象
// 修改外面的变量,并不会影响到内部的成员变量
@property (nonatomic,copy) NSString *name;
+ (id)studentWithName:(NSString *)name;
@end
.m文件的内容
#import "Student.h"
@implementation Student
+ (id)studentWithName:(NSString *)name {
// 这里最好写[self class]
Student *stu = [[[[selfclass] alloc]init] autorelease];
stu.name = name;
return stu;
}
- (void)dealloc {
[_namerelease];
[superdealloc];
}
#pragma mark description方法内部不能打印self,不然会造成死循环
- (NSString *)description {
return [NSStringstringWithFormat:@"[name=%@]",_name];
}
#pragma mark copying协议的方法实现
// 这里创建的副本对象不要求释放
- (id)copyWithZone:(NSZone *)zone {
Student *copy = [[[selfclass] allocWithZone:zone]init];
//拷贝名字给副本对象
copy.name =self.name;
return copy;
}
@end
main函数中的实现为:
int main(int argc,const char * argv[])
{
@autoreleasepool {
Student *stu1 = [Student studentWithName:@"stu1"];
Student *stu2 = [stu1 copy];
stu2.name =@"stu2";
NSLog(@"stu1:%@", stu1);
NSLog(@"stu2:%@", stu2);
[stu2release];
}
return 0;
}
//当copy为浅拷贝时,setter实现时copy相当于retain
//copy代表set方法会release就对象,copy新对象。
@property(nonatmoic,copy)NSString *name;
以上代码相当与在类的实现时以下的两段代码:
- (void) setname :(NSString *)name{
if(_name !=name){
[_name release];
_name=[name copy]; //retain做修饰词则此处为retain
}
}
- (void) dealoc{
[_name release]
[super dealoc];
}
tip:建议:NSString一般使用copy策略,其他一般对象使用retain。
- OC——copy语法的基本使用
- OC——copy语法的基本使用
- OC基础——copy语法(Student属性的copy、Student对象的copy、Student子类对象的copy)
- OC语法基本使用
- OC——多态、NSString的基本使用、点语法、成员变量作用域
- (IOS系列)——OC基础语法:Copy
- 黑马程序员——01OC的基本语法
- OC语法——Object-C retain、copy、mutableCopy的详细分析
- OC语法之Copy
- 19-OC-copy语法
- OC中copy的使用
- OC中copy的使用
- OC中copy的使用
- OC中copy的使用
- OC 中copy的使用
- 黑马程序员——OC基础——OC基本语法和面向对象的基本概念
- C++基本语法-----copy
- OC-057.copy和MutableCopy的使用
- 【DP】 HDOJ 4284 Travel
- html 页面标签转换效果实例
- OC中Block的使用
- Java中Set的使用
- 致IT同仁 — IT人士常犯的17个职场错误
- OC——copy语法的基本使用
- Yii登陆添加验证码
- HDU 4003 Find Metal Mineral 树形DP
- Android 一步一步实现版本自动更新(第二步 下载和安装apk)
- Android中的Handler的具体用法
- Leetcode: Combination Sum II
- 灰度图像--图像分割 阈值处理综述
- Pro Android学习笔记(八九):了解Handler(3):延迟执行小例子
- 线程的状态间转换