您的位置:首页 > 运维架构

NSCopy与NSMutableCopy技术点

2016-03-13 10:38 309 查看
内存管理

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;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: