Answers:
与引用类型一样,“复制”有两个概念。我确定您了解它们,但出于完整性考虑。
您想要后者。如果这是您自己的对象之一,则只需采用协议NSCopying并实现-(id)copyWithZone:(NSZone *)zone。您可以自由地做任何想做的事。尽管您的想法是您复制自己的真实副本并返回。您可以在所有字段上调用copyWithZone进行深拷贝。一个简单的例子是
@interface YourClass : NSObject <NSCopying>
{
SomeOtherObject *obj;
}
// In the implementation
-(id)copyWithZone:(NSZone *)zone
{
// We'll ignore the zone for now
YourClass *another = [[YourClass alloc] init];
another.obj = [obj copyWithZone: zone];
return another;
}
autorelease
,或者我在这里想念什么?
copyWithZone:
满足此条件,因此它必须返回保留计数为+1的对象。
alloc
而不是allocWithZone:
因为传入了区域?
allocWithZone
。
苹果文档说
copyWithZone:方法的子类版本应首先将消息发送给super,以合并其实现,除非该子类直接来自NSObject。
添加到现有答案
@interface YourClass : NSObject <NSCopying>
{
SomeOtherObject *obj;
}
// In the implementation
-(id)copyWithZone:(NSZone *)zone
{
YourClass *another = [super copyWithZone:zone];
another.obj = [obj copyWithZone: zone];
return another;
}
No visible @interface for 'NSObject' declares the selector 'copyWithZone:'
。我猜只有在我们从其他实现的自定义类继承时才需copyWithZone
我不知道该代码和我的代码之间的区别,但是该解决方案存在问题,因此我阅读了更多内容,发现必须在返回对象之前对其进行设置。我的意思是:
#import <Foundation/Foundation.h>
@interface YourObject : NSObject <NSCopying>
@property (strong, nonatomic) NSString *name;
@property (strong, nonatomic) NSString *line;
@property (strong, nonatomic) NSMutableString *tags;
@property (strong, nonatomic) NSString *htmlSource;
@property (strong, nonatomic) NSMutableString *obj;
-(id) copyWithZone: (NSZone *) zone;
@end
@implementation YourObject
-(id) copyWithZone: (NSZone *) zone
{
YourObject *copy = [[YourObject allocWithZone: zone] init];
[copy setNombre: self.name];
[copy setLinea: self.line];
[copy setTags: self.tags];
[copy setHtmlSource: self.htmlSource];
return copy;
}
我添加了此答案,因为我在此问题上有很多问题,并且不知道为什么会这样。我不知道区别,但是它对我有用,也许对其他人也有用:)
another.obj = [obj copyWithZone: zone];
我认为,这行会导致内存泄漏,因为您访问了obj
(我假设)声明为的穿透属性retain
。因此,保留计数将随属性和的增加而增加copyWithZone
。
我相信应该是:
another.obj = [[obj copyWithZone: zone] autorelease];
要么:
SomeOtherObject *temp = [obj copyWithZone: zone];
another.obj = temp;
[temp release];