NSCopy与NSMutableCopy技术点
2016-03-13 10:38
309 查看
内存管理
NSString的copy实例
对象的copy实例
一、概念
目的:在改变原有对象的时候,不会改变新对象的值
Copy:实现NSCopying协议,创建的是一个不可变副本
MutableCopy:实现NSMutableCopying协议,创建的是一个可变副本
二、内
深拷贝:产生新的对象,所以源对象计数器不变>>>对象拷贝
浅拷贝:不产生新对象,所以源对象计数器加一>>>指针拷贝
三、NSString的copy实例
四、对象拷贝的实例
对象的拷贝,主要注意点
1.必须实现NSCopying协议
2.需要重写- (id)copyWithZone:(NSZone *)zone方法
GoodStudent.h
Student.h
main.m
NSString的copy实例
对象的copy实例
一、概念
目的:在改变原有对象的时候,不会改变新对象的值
Copy:实现NSCopying协议,创建的是一个不可变副本
MutableCopy:实现NSMutableCopying协议,创建的是一个可变副本
二、内
深拷贝:产生新的对象,所以源对象计数器不变>>>对象拷贝
浅拷贝:不产生新对象,所以源对象计数器加一>>>指针拷贝
三、NSString的copy实例
#import <Foundation/Foundation.h> void test1() { NSString *str = [NSString stringWithFormat:@"age is %i", 10]; NSString *str1 = [str copy]; NSLog(@"%i", str == str1); NSString *str2 = [str mutableCopy]; NSLog(@"%i", str2 == str); } void test2() { NSMutableString *str = [NSMutableString stringWithFormat:@"age is %i", 11]; NSString *str1 = [str copy]; NSMutableString *str2 = [str mutableCopy]; [str appendFormat:@"1"]; NSLog(@"%i", str == str2); NSLog(@"%i", str == str1); NSLog(@"%@", str); NSLog(@"%@", str1); } int main(int argc, const char * argv[]) { @autoreleasepool { test2(); } return 0; }
四、对象拷贝的实例
对象的拷贝,主要注意点
1.必须实现NSCopying协议
2.需要重写- (id)copyWithZone:(NSZone *)zone方法
GoodStudent.h
#import "Student.h" @interface GoodStudent : Student @property (nonatomic, assign) int age; +(id)goodStudentWithName:(NSString *)name withAge:(int)age; @end GoodStudent.m #import "GoodStudent.h" @implementation GoodStudent +(id)goodStudentWithName:(NSString *)name withAge:(int)age { GoodStudent *stu = [super studentWithName:name]; stu.age = age; return stu; } -(id)copyWithZone:(NSZone *)zone { GoodStudent *copy = [super copyWithZone:zone]; copy.age = self.age; return copy; } -(NSString *)description { return [NSString stringWithFormat:@"%@-%i", self.name, self.age]; } @end
Student.h
#import <Foundation/Foundation.h> @interface Student : NSObject <NSCopying> @property (nonatomic, copy) NSString *name; +(id)studentWithName:(NSString*)name; @end Student.m #import "Student.h" @implementation Student +(id)studentWithName:(NSString *)name { Student *stu = [[[[self class] alloc] init] autorelease]; stu.name = name; return stu; } - (id)copyWithZone:(NSZone *)zone { Student *copy = [[self class] allocWithZone:zone]; copy.name = self.name; return copy; } -(NSString *)description { return [NSString stringWithFormat:@"%@", self.name]; } -(void)dealloc { [_name release]; [super dealloc]; } @end
main.m
#import <Foundation/Foundation.h> #import "GoodStudent.h" void test1() { Student *stu = [Student studentWithName:@"name1"]; Student *stu1 = [stu copy]; NSLog(@"%@", stu); NSLog(@"%@", stu1); } void test2() { GoodStudent *stu1 = [GoodStudent goodStudentWithName:@"name1" withAge:10]; GoodStudent *stu2 = [stu1 copy]; NSLog(@"%@", stu1); NSLog(@"%@", stu2); } int main(int argc, const char * argv[]) { @autoreleasepool { test2(); } return 0; }
相关文章推荐
- Linux下C语言Mysql数据库使用范例
- openwrt之下显示连接的STA的mac和Rssi
- 跟踪分析Linux内核的启动过程
- linux下编写I2C驱动与stm32通信(一)
- 排序 -- sort
- linux初学者必备..分享几个linux下载安装的链接(贴吧转的)
- linux下如何查看系统和内核版本
- ecshop 获取所在商品的顶级分类ID及NAME
- 【Linux】手动增加虚拟内存
- 使用nginx来完成反向代理及处理静态文件请求
- Linux下jvm与tomcat的安全与优化
- Linux死机解决办法
- hadoop2.x常用端口、定义方法及默认端口、hadoop1.X端口对比
- docker技术分享一览
- CentOS7卸载KDE桌面(转)
- 百人团队敏捷转型日记 第一集 架构师没了、版本管理的蜕变
- IT忍者神龟之在Tomcat配置JNDI数据源的三种方式
- Linux中echo命令实例
- shell 格式化输出
- 【记录】VS2012新建项目时,报:此模板尝试加载组件程序集“NuGet.VisualStudio.Interop...”