copy的原理:
执行<NSCopying>协议,类中必须实现copyWithZone:方法响应的copy消息。
copy消息将发送copyWithZone:这个消息给你的类,它的参数是nil。
copyWithZone:返回一个不可改变的copy
*MyPoint.h*/
#import <Foundation/Foundation.h>
@interface MyPoint : NSObject<NSCopying>//继承超类
{
int x;
int y;
};
//set方法
-(void) setMyPoint:(int)x andY:(int)y;
//get方法
-(int) getX;
-(int) getY;
@end
/*MyPoint.m*/
#import "MyPoint.h"
@implementation MyPoint
-(void) setMyPoint:(int)_x andY:(int)_y
{
//要对传进来的x和y进行判断
if(_x<0)
{
x = 1;
}
if(_y<0)
{
y = 1;
}
x = _x;
y = _y;
}
-(int) getX
{
return x;
}
-(int) getY
{
return y;
}
//copy
/*
zone参数处理不同的你alloc出来的内存区域,如果你写的应用程序alloc了大量的内存,并且你又想优化你的内存区域。
你可以给copywithzone传值,调用allocwithzone来alloc内存:这个方法可以在指定的区域alloc内存
*/
-(id) copyWithZone:(NSZone *)zone //创建一个复制的接收器,储存zone
{
MyPoint *newPoint = [[MyPoint allocWithZone:zone]init];
[newPoint setMyPoint:x andY:y];
return newPoint;
}
/*
NSZone 是苹果系统对内存分配和释放的优化方式。
NSZone不是一个对象;它是一个C结构,用于纪录关于内存处理(管理)一系列对象的信息
在这里它处理了zone这个传进来的对象的信息
*/
@end
#import <Foundation/Foundation.h>
#import "MyPoint.h"
int main (int argc, const char * argv[])
{
MyPoint *point1 = [[MyPoint alloc]init];//创建myPoint对象,alloc是分配内存空间,init是初始化
[point1 setMyPoint:2 andY:3];//调用对象point1的方法
NSLog(@"x = %i",[point1 getX]);//[point1 getX]调用get方法
NSLog(@"y = %i",[point1 getY]);
MyPoint *point2 = [point1 copy];//实现复制构造
[point2 setMyPoint:5 andY:5];
NSLog(@"x = %i",[point2 getX]);
NSLog(@"y = %i",[point2 getY]);
[point1 release];// release 是释放分配的内存空间
[point2 release];
return 0;
}