【问题标题】:Does this copy class method leak memory?这个复制类方法会泄漏内存吗?
【发布时间】:2010-10-08 07:29:54
【问题描述】:
- (id)copyWithZone:(NSZone *)zone {
    PoolFacility *copy = [[[self class] allocWithZone:zone]init];
    copy.name = [self.name copy];
    copy.type = [self.type copy];
    copy.phoneNumber = [self.phoneNumber copy];
    //make sure I get proper copies of my dictionaries
    copy.address = [self.address mutableCopy];  
    copy.webAddress = [self.webAddress copy];
    copy.prices = [self.prices mutableCopy];
    copy.pools = [self.pools mutableCopy];
    return copy;
}

任何人都可以看到任何内存泄漏吗?

这里是属性类型:

NSString *name;
NSString *type;
NSMutableDictionary *address;

NSString *phoneNumber;
NSString *webAddress;   

NSMutableArray *prices;
NSMutableArray *pools;

以下是属性声明:

@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *type;
@property (nonatomic, copy) NSString *phoneNumber;
@property (nonatomic, retain) NSMutableDictionary *address;
@property (nonatomic, copy) NSString *webAddress;
@property (nonatomic, retain) NSMutableArray *prices;
@property (nonatomic, retain) NSMutableArray *pools;

【问题讨论】:

  • 重新标记,因为它不是 iPhone 特有的,其他标签可以更好地对其进行分类。
  • 称我为losernoob,但这是我第一次遇到mutableCopy。有人愿意快速解释一下它与copy 有何不同吗?

标签: objective-c cocoa memory-management memory-leaks properties


【解决方案1】:

定义为 copy 而不是 retain 的属性在设置如下时会有一个额外的副本(您的代码)

copy.name = [self.name copy];
copy.type = [self.type copy];
copy.phoneNumber = [self.phoneNumber copy];
copy.webAddress = [self.webAddress copy];

只写成

就足够了
copy.name = self.name;
copy.type = self.type;
copy.phoneNumber = self.phoneNumber;
copy.webAddress = self.webAddress;

【讨论】:

  • 但这不会破坏复制方法的意义吗?我将复制该类,但变量将指向相同的对象?或者这会给我 2 个完全独立的对象?
  • “@property (..., copy)”表示使用点符号时会创建一个副本。之前的值将被发送释放。
  • Dan Morgan:合成访问器将为您复制对象,因为您将属性声明为@property(copy)。如果您自己复制对象,访问者将复制这些副本。由于您没有发布这些中间副本,因此它们都被泄露了。
  • 所有复制的对象都会泄漏。它不依赖于属性类型(复制或保留)。
【解决方案2】:

这几乎肯定会像筛子一样泄漏。您需要提供您的@property 和其他方法声明,以便我们推荐修复它的最佳方法。

【讨论】:

    猜你喜欢
    • 2016-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-03-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-15
    相关资源
    最近更新 更多