关于copyWithZone的写法

2012-05-04 20:41:32 +08:00
 adow
之前我一直没注意过,今天在instruments中运行发现我写的copyWithZone 都有leaks,比如一个很简单的类:
.h 里面

@interface PostImageModal : NSObject{
NSString *small;
NSString *medium;
NSString *big;
}
@property (nonatomic,copy) NSString *small;
@property (nonatomic,copy) NSString *medium;
@property (nonatomic,copy) NSString *big;
@end

.m 里面

@implementation PostImageModal
@synthesize small;
@synthesize medium;
@synthesize big;
-(id)copyWithZone:(NSZone*)zone{
PostImageModal *copy=[[[self class] allocWithZone:zone]init];
copy.small=small;
copy.medium=medium;
copy.big=big;
return copy;
}
-(void)dealloc{
[small release];
[medium release];
[big release];
[super dealloc];
}
@end

运行的是instruments里提示 [PostImageModal copyWithZone:] leaks, 我不清楚哪里的问题啊,有人遇到么?
8660 次点击
所在节点    iDev
13 条回复
Kai
2012-05-05 00:58:12 +08:00
试试看 [copy autorelease];
kejinlu
2012-05-05 01:02:05 +08:00
你这个很明显的内存泄露啊,谁创建谁负责释放,所以 return [copy autorelease]; 或者创建的时候 PostImageModal *copy=[[[[self class] allocWithZone:zone] init] autorelease];
Smartype
2012-05-05 10:34:57 +08:00
@kejinlu 然后assignee to retain????
这是copyWithZone方法
adow
2012-05-05 10:46:21 +08:00
无论是 PostImageModal *copy=[[[[self class] allocWithZone:zone] init] autorelease]; 还是 retur [copy autorelease];

在Analyze 的时候都是:Object with a +0 retain count returned to caller where a+1 (owning) retain count is expected

@Kai @kejinlu
Smartype
2012-05-05 10:52:08 +08:00
@adow 检查赋值当然地方,自己算算retaincount就明白了
adow
2012-05-05 11:11:34 +08:00
@Smartype 我有点糊涂啊,是说这个里面写的是对的,外面用上copy的地方有问题吗?
mr_pppoe
2012-05-05 11:39:01 +08:00
@kejinlu copyXXX不是应该返回一个retainCount=1的object? 我觉得这段没有问题啊?
xesique
2012-05-05 12:04:01 +08:00
依照Objective-C方法命名的惯例,调用以alloc、new、copy、mutableCopy等开头的方法名时,需要由调用方进行release操作。因此,copyWithZone:的实现应该不应返回autorelease的对象。

参见
https://discussions.apple.com/thread/296134?threadID=296134
https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html
kejinlu
2012-05-05 12:06:19 +08:00
嗯 应该是调用方去释放 我之前说错了
kejinlu
2012-05-05 12:14:26 +08:00
@mr_pppoe 哈哈 我看大意了,应该是调用方负责释放。返回不应该autorelease :)
xesique
2012-05-05 12:18:28 +08:00
至于LZ说的leaks我怀疑是其他地方导致的泄漏,分配行为是在copyWithZone:中的,因而Instruments会报告这里泄漏。
Smartype
2012-05-05 12:20:06 +08:00
@adow 这里是对的。机器只能告诉你泄漏的资源是哪里分配的。慢慢找吧。我估计你retain了他
adow
2012-05-05 13:41:09 +08:00
恩的确是在外面泄露了,赋值给别的地方的一个property 的时候,retain 了一下,而那个property 本身应该是retain的

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/34652

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX