【发布时间】:2011-04-14 03:25:56
【问题描述】:
我有一个自定义对象,我正在使用 NSKeyedArchiver 转换为 NSData,因此我的自定义对象实现了 NSCoding 协议。但是当我运行 Instruments 工具时,它告诉我 initWithCoder 方法在 initWithCoder 中有许多泄露的 NSCFString 对象。
实现 NSCoding 协议的正确方法是什么?
我的班级:
@interface EventProfile : NSObject <NSCoding>
NSString *eventTitle;
NSString *groupName;
@end
@implementation EventProfile
// NSCoding methods
-(id) initWithCoder:(NSCoder *)decoder
{
if (self = [super init])
{
eventTitle = [[decoder decodeObjectForKey:@"eventTitle"] retain];
groupName = [[decoder decodeObjectForKey:@"groupName"] retain];
}
return self;
}
-(void) encodeWithCoder:(NSCoder *)encoder
{
[encoder encodeObject:self.eventTitle forKey:@"eventTitle"];
[encoder encodeObject:self.groupName forKey:@"groupName"];
}
// Memory management
- (void)dealloc
{
[eventTitle release];
[groupName release];
[super dealloc];
}
@end
【问题讨论】:
-
eventTitle和groupName属性的定义是什么?如果他们是copy,我觉得一切正常。但是如果他们不小心assign你可能会遇到问题。您是否还可以在initWithCoder:方法中使用self.eventTitle和self.groupName测试运行代码?除此之外,泄漏可能是在使用EventTitle类的地方在不同的地方。 -
是的,您的界面没有显示任何属性定义,但您在
encodeWithCoder:中使用了self.eventTitle和self.groupName??
标签: iphone memory-leaks