第二十五讲:Objective-C内存管理之浅拷贝
上一讲简述了拷贝的基本原理,这一讲以一个类进行说明浅拷贝的效果1、创建一个类Car、使用<NSCopying>,<NSMutableCopying>协议对对象进行拷贝,自创的类必须实现拷贝中的 - (id)copyWithZone:(NSZone *)zone 方法或- (id)mutableCopyWithZone:(NSZone *)zone 方法;
2、修改拷贝对象中的值,这里区分copy与retain在对象操作中的不同点:car1 = car指向的是同一对象,car1 = 创建了另外一个对象,修改对象中的值不影响原来对象的值,但对象中的使用的其他对象不拷贝;
3、深拷贝则对对象引用的其他对象都进行拷贝(后续通过深拷贝说明);
SACar.h
//
//SACar.h
//Copy
//
//Created by yusian on 14-1-22.
//Copyright (c) 2014年 yusian. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface SACar : NSObject <NSCopying, NSMutableCopying>
@property int year;
@property (copy) NSString *name;
@end
SACar.m
//
//SACar.m
//Copy
//
//Created by yusian on 14-1-22.
//Copyright (c) 2014年 yusian. All rights reserved.
//
#import "SACar.h"
@implementation SACar
- (id) copyWithZone:(NSZone *)zone {
SACar * c = [[[ allocWithZone:zone] init] autorelease];
c.name = self.name;
c.year = self.year;
return c;
}
- (id) mutableCopyWithZone:(NSZone *)zone {
SACar * c = [[[ allocWithZone:zone] init] autorelease];
c.name = self.name;
c.year = self.year;
return c;
}
- (NSString *) description {
return ;
}
- (void) dealloc {
NSLog(@"%@ is dealloc", self.name);
;
}
@end
main.m
//
//main.m
//Copy
//
//Created by yusian on 14-1-22.
//Copyright (c) 2014年 yusian. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "SACar.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
SACar * car = [[ init] autorelease];
car.name = @"Cruze";
car.year = 2013;
NSLog(@"%@", car);
SACar * car1 = ;
car1.name = @"Sonata";
car1.year = 2014;
NSLog(@"%@", car1);
NSLog(@"%@ retainCount is %ld", car.name, car.retainCount);
NSLog(@"%@ retainCount is %ld", car1.name, car1.retainCount);
;
NSLog(@"%@ retainCount is %ld", car.name, car.retainCount);
NSLog(@"%@ retainCount is %ld", car1.name, car1.retainCount);
;
}
return 0;
}输出结果:
2014-01-22 20:14:08.733 Copy Cruze age is 2013
2014-01-22 20:14:08.735 Copy Sonata age is 2014
2014-01-22 20:14:08.735 Copy Cruze retainCount is 1
2014-01-22 20:14:08.735 Copy Sonata retainCount is 1
2014-01-22 20:14:08.736 Copy Cruze retainCount is 2
2014-01-22 20:14:08.736 Copy Sonata retainCount is 1
2014-01-22 20:14:08.736 Copy Sonata is dealloc
2014-01-22 20:14:08.737 Copy Cruze is dealloc
Program ended with exit code: 0
如果将使用赋值,则效果如下:
main.m
//
//main.m
//Copy
//
//Created by yusian on 14-1-22.
//Copyright (c) 2014年 yusian. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "SACar.h"
int main(int argc, const char * argv[])
{
@autoreleasepool {
SACar * car = [[ init] autorelease];
car.name = @"Cruze";
car.year = 2013;
NSLog(@"%@", car);
SACar * car1 =car;
car1.name = @"Sonata";
car1.year = 2014;
NSLog(@"%@", car1);
NSLog(@"%@", car);
NSLog(@"%@ retainCount is %ld", car.name, car.retainCount);
NSLog(@"%@ retainCount is %ld", car1.name, car1.retainCount);
;
NSLog(@"%@ retainCount is %ld", car.name, car.retainCount);
NSLog(@"%@ retainCount is %ld", car1.name, car1.retainCount);
;
}
return 0;
}
输出结果为:
2014-01-22 20:23:00.775 Copy Cruze age is 2013
2014-01-22 20:23:00.776 Copy Sonata age is 2014
2014-01-22 20:23:00.777 Copy Sonata age is 2014
2014-01-22 20:23:00.777 Copy Sonata retainCount is 1
2014-01-22 20:23:00.777 Copy Sonata retainCount is 1
2014-01-22 20:23:00.777 Copy Sonata retainCount is 2
2014-01-22 20:23:00.778 Copy Sonata retainCount is 2
2014-01-22 20:23:00.778 Copy Sonata is dealloc
Program ended with exit code: 0
页:
[1]