ObjectiveC中的赋值,对象拷贝,浅拷贝与深拷贝(续)

原创 2012年03月22日 23:47:48

三、实现对象的拷贝

对于我们自己创建的类来说,如果需要实现对象的拷贝,则需要实现NSCopying协议或者NSMutableCopying协议。前者用于实现对象拷贝,而后者则通常会返回一个可以进行修改的对象副本,例如Foundation框架中的常用容器类NSArray、NSSet等。这两个协议定义如下:

@protocol NSCopying
- (id)copyWithZone:(NSZone *)zone;
@end

@protocol NSMutableCopying
- (id)mutableCopyWithZone:(NSZone *)zone;
@end
copy方法与mutableCopy方法分别会调用copyWithZone:方法与mutableCopyWithZone:方法,并传入nil。将代码修改如下:

int main(int argc, const char * argv[])
{
    @autoreleasepool
    {        
        TestObject* to1 = [[[TestObject alloc] init] autorelease];
        to1->x = 100; to1->y = 50;

        TestObject* to2 = [to1 copy];
        NSLog(@"to2: %@", to2);
    }
    return 0;
}
程序编译通过,但运行时抛出异常:

-[TestObject copyWithZone:]: unrecognized selector sent to instance 0x10e2141b0
*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[TestObject copyWithZone:]: unrecognized selector sent to instance 0x10e2141b0'
原因是TestObject类尚未遵从NSCopying,因此无法进行拷贝。将TestObject类修改如下:

@interface TestObject : NSObject <NSCopying>
{
    @public
    int x;
    int y;
}
@end

@implementation TestObject
- (NSString*)description
{
    return [NSString stringWithFormat:@"%@: %p, x: %d, y: %d", [self class], self, x, y];
}

- (id)copyWithZone:(NSZone *)zone
{
    TestObject* newTestObject = [[TestObject allocWithZone:zone] init];
    newTestObject->x = self->x;
    newTestObject->y = self->y;
    
    return newTestObject;
}
@end
再次编译运行,这一次运行正常,输出如下结果:

to2: TestObject: 0x7ffaa84141c0, x: 100, y: 50
注意,copyWithZone:方法调用allocWithZone:方法申请了内存空间并创建了一个新的对象,因此调用copy或者mutableCopy的代码需要对拷贝的对象进行内存的释放操作,忘记释放会导致内存泄漏。


iOS中变量命名引起的错误错误: [UILabel copyWithZone:]: unrecognized selector sent to instance

今天用Xcode写个小demo的时候遇到一个错误: [UILabel copyWithZone:]: unrecognized selector sent to instance 找了半天也没有找出...
  • chenbo163
  • chenbo163
  • 2015年04月12日 21:37
  • 1911

-[UIImageView _isResizable]: unrecognized selector sent to instance

检查storyboard或者xib中对象的连接是否
  • izyhuang
  • izyhuang
  • 2014年11月16日 16:11
  • 962

IOS深浅拷贝的深入分析

Apple官方文档如下:https://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/Collections/Arti...
  • omegayy
  • omegayy
  • 2012年03月02日 12:54
  • 8977

错误: [UILabel copyWithZone:]: unrecognized selector sent to instance

12down voteaccepted I guess this was one of those weird bugs with XCode that you can't tr...
  • ganlijianstyle
  • ganlijianstyle
  • 2012年11月16日 07:16
  • 8246

'NSInvalidArgumentException', reason: '-[Teacher copyWithZone:]: unrecognized selector sent to insta

原因:该对象没有实现NSCopying协议 解决方案:服从协议, 并且实现协议中的方法...
  • vaercly
  • vaercly
  • 2014年08月15日 16:11
  • 983

[__NSCFConstantString size]: unrecognized selector sent to instance 0x6ead08

该错误是在我将NSString类型的参数赋值给UIImage类型的时候报出的,查了一会才查出是这的问题。 如果大家不是这个问题查一下是不是也是赋值类型错了。...
  • miaocuilin
  • miaocuilin
  • 2014年12月03日 10:22
  • 3302

Java对象的浅拷贝与深拷贝

浅拷贝与深拷贝 浅拷贝(浅克隆):被复制对象的所有变量都含有与原来的对象相同的值,而所有的对拷贝对象的引用仍然指向原来的对象。换言之,浅拷贝仅仅复制基本数据类型,而不复制引用类型的对象。 深拷贝...
  • xiaoyaoyulinger
  • xiaoyaoyulinger
  • 2016年08月02日 22:12
  • 554

C++中浅拷贝、深拷贝、对象的复制、对象的赋值

一、概念字面理解 1、浅拷贝:发生对象复制时,只是对对像张数据成员进行简单的赋值。涉及到动态分配问题,如果按浅拷贝进行复制,不做特殊处理,复制完成后,两个对象中涉及动态分配空间的变量,不管他们各自的空...
  • A670449625
  • A670449625
  • 2016年08月03日 11:30
  • 1970

异样的unrecognized selector sent to instance

Reachability的源代码,在一个静态库中定义,调用的地方在IOS App工程中 Reachability *reach = [[[Reachability alloc] in...
  • holdsky
  • holdsky
  • 2015年12月29日 13:46
  • 839

copy和strong,错误信息unrecognized selector sent to instance

今天复习tableViewController,写了段添加地区的代码。实现根视图显示市名和人数(detailLabel),点击cell显示下面的县或者区。NavigationBar右上角+点击可以新增...
  • LyTsai
  • LyTsai
  • 2015年07月13日 15:24
  • 416
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:ObjectiveC中的赋值,对象拷贝,浅拷贝与深拷贝(续)
举报原因:
原因补充:

(最多只允许输入30个字)