对象[self class]来调用的复制?

对象的复制就相当于JAVA 中的clone()方法,也就是对象的深度复制,所谓深度复制就是重

新分配一个存储空间,并将原对象的内容都复制过来,从这些描述可以看出,复制也会分配

空间,那就是你要对复制出来的对象release,就是前面所说的alloc、new、copy 操作创建

的对象,要手工release。

Objective-C 中的一个对象是否可以被复制,要看它的类型是否遵循NSCopying 协议,这个协

议中有个复制方法-(id) copyWithZone: (*NSZone) zone 需要我们去实现。

  
Engine.h

#import <Foundation/Foundation.h>

@interface Engine: NSObject <NSCopying>

@end

Engine.m

#import "Engine.h"

@implementation Engine

-(id) copyWithZone: (NSZone*) zone

{

Engine *engine=[[[self class] allocWithZone: zone] init];

return engine;

}

@end

这个类方法必须用[self class]来调用,而不能用Engine 来调用?

评论 (3)链接2012-12-17 
  • 0 支持
    [self class]的意思是获取当前实例的Class 对象,也就是运行时动态获
    取的,这样就可以保证子类复制的时候,这个地方返回的是子类的Class 对象,而不是
    父类Engine。
    – Thinking80s 2012-12-17
  • 0 支持
    http://blog.csdn.net/edward0004/article/details/7264824 – Thinking80s 2012-12-17
  • 0 支持
    由于
    allocWithZone 用的是Engine 来调用的,那么也就是分配的空间也是按照Engine 的结构
    来分配的(分配空间前面说过,主要就是给成员变量确定在内存中的位置),这样根本
    就不会考虑子类新增加的成员变量,从而导致内存溢出,因为子类的新的成员变量根本
    就没有存储位置
    – Thinking80s 2012-12-17
德问是一个专业的编程问答社区,请 登录注册 后再提交答案