Sian 发表于 2014-1-22 20:19:28

第二十五讲: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

Sian 发表于 2014-1-22 20:23:47

如果将使用赋值,则效果如下:
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]
查看完整版本: 第二十五讲:Objective-C内存管理之浅拷贝