在设备上测试我的应用程序时,当我调用自定义对象的副本时,它会返回一个漏洞,但我不明白为什么。
这就是调用:
NSMutableArray *arr = [[NSMutableArray alloc] initWithCapacity:5];
for (SinglePart *sp in [copyFrom partList]) {
[arr addObject:[sp copy]];
}
self.partList = arr;
[arr release];方法如下:
- (id)copyWithZone:(NSZone *)zone {
SinglePart *copy = [[[self class] allocWithZone:zone] initWithSinglePart:self];
[copy loadImage];
return copy;
}这是由copyWithZone调用的方法:
- (id)initWithSinglePart:(SinglePart *)copyFrom {
if (self = [super init]) {
self.imagePath = [copyFrom.imagePath copy];
self.color = [UIColor colorWithCGColor:copyFrom.color.CGColor];
self.hasOwnColor = copyFrom.hasOwnColor;
self.blendingMode = copyFrom.blendingMode;
}
return self;
}发布于 2010-10-13 00:37:58
copy返回一个保留计数为1的新对象。这意味着您需要释放新对象,而您并没有这样做。
NSMutableArray *arr = [[NSMutableArray alloc] initWithCapacity:5];
for (SinglePart *sp in [copyFrom partList]) {
SingPart *theCopy = [sp copy];
[arr addObject:theCopy];
[theCopy release];
}
self.partList = arr;
[arr release];甚至您的自定义copyWithZone:方法也会初始化一个对象,但不会自动释放它,这是copy方法的预期行为。复制必须是平衡的,就像保留或初始化一样,这意味着你必须在某个时刻平衡它与释放。
最后,您的initWithSinglePart:方法也会泄漏imagePath。在这种情况下,如果将imagePath属性声明为copy而不是retain,则根本不需要手动执行此操作。然后,您只需赋值并让属性设置器为您进行赋值。
// Header
@property (copy) NSString *imagePath;
// Now this will do the copy for you
self.imagePath = copyFrom.imagePath;发布于 2010-10-13 00:41:33
另外,属性imagePath是用retain还是copy语义定义的?
如果是这样,您需要在此处添加一个自动释放:
self.imagePath = [[copyFrom.imagePath copy] autorelease];因为默认的设置器也会保留/复制它。
因此,您要么需要自动释放,要么省略“self”。绕过默认的setter。
发布于 2010-10-13 00:38:57
您正在制作sp的副本,然后将其添加到数组中。然后,数组将保留对象,因此保留计数现在为2。
最后释放arr,从而使它的项目的保留计数为1。
您应该向sp对象添加另一个版本,或者不使用copy。
试试这个:
self.partList = [NSMutableArray arrayWithCapacity:5];
for (SinglePart *sp in [copyFrom partList]) {
[arr addObject:sp];
}https://stackoverflow.com/questions/3916923
复制相似问题