首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IPhone - copyWithZone泄漏

IPhone - copyWithZone泄漏
EN

Stack Overflow用户
提问于 2010-10-13 00:32:07
回答 3查看 2K关注 0票数 0

在设备上测试我的应用程序时,当我调用自定义对象的副本时,它会返回一个漏洞,但我不明白为什么。

这就是调用:

代码语言:javascript
复制
NSMutableArray *arr = [[NSMutableArray alloc] initWithCapacity:5];
for (SinglePart *sp in [copyFrom partList]) {
    [arr addObject:[sp copy]];
}
self.partList = arr;
[arr release];

方法如下:

代码语言:javascript
复制
- (id)copyWithZone:(NSZone *)zone {
    SinglePart *copy = [[[self class] allocWithZone:zone] initWithSinglePart:self];
    [copy loadImage];
    return copy;
}

这是由copyWithZone调用的方法:

代码语言:javascript
复制
- (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;
 }
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-10-13 00:37:58

copy返回一个保留计数为1的新对象。这意味着您需要释放新对象,而您并没有这样做。

代码语言:javascript
复制
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,则根本不需要手动执行此操作。然后,您只需赋值并让属性设置器为您进行赋值。

代码语言:javascript
复制
// Header
@property (copy) NSString *imagePath;

// Now this will do the copy for you
self.imagePath = copyFrom.imagePath;
票数 4
EN

Stack Overflow用户

发布于 2010-10-13 00:41:33

另外,属性imagePath是用retain还是copy语义定义的?

如果是这样,您需要在此处添加一个自动释放:

代码语言:javascript
复制
self.imagePath = [[copyFrom.imagePath copy] autorelease];

因为默认的设置器也会保留/复制它。

因此,您要么需要自动释放,要么省略“self”。绕过默认的setter。

票数 1
EN

Stack Overflow用户

发布于 2010-10-13 00:38:57

您正在制作sp的副本,然后将其添加到数组中。然后,数组将保留对象,因此保留计数现在为2。

最后释放arr,从而使它的项目的保留计数为1。

您应该向sp对象添加另一个版本,或者不使用copy

试试这个:

代码语言:javascript
复制
self.partList = [NSMutableArray arrayWithCapacity:5];
for (SinglePart *sp in [copyFrom partList]) {
    [arr addObject:sp];
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3916923

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档