NSCopy与NSMutableCopy技术点

来源:互联网 发布:手机看股软件 编辑:程序博客网 时间:2024/05/17 23:33

内存管理
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;@endGoodStudent.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;@endStudent.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;}
0 0