【问题标题】:NSKeyedUnarchiver memory leak issueNSKeyedUnarchiver 内存泄漏问题
【发布时间】:2023-03-12 01:48:01
【问题描述】:

我对这段代码有疑问,它正在调试环境中工作。在我看到此功能存在内存泄漏问题的仪器上,仪器发出警告

类别事件类型时间戳地址大小负责库负责调用者 27 SocialNetwork Malloc 00:19.951 0x3d64d20 80 基金会-[NSKeyedUnarchiver _decodeArrayOfObjectsForKey:]

- (NSMutableArray *)GetDataInstanceToUserDefaults{
NSUserDefaults *userDefaults = [NSUserDefaults standardUserDefaults];   
NSData *storedObject = [userDefaults objectForKey:@"MyDataKey"];
NSMutableArray *data;   

if(storedObject != nil)
{       
    NSArray *savedArray = [NSKeyedUnarchiver unarchiveObjectWithData:storedObject];
    if(savedArray != nil)
        data = [[NSMutableArray alloc] initWithArray:savedArray];
    else
        data = [[NSMutableArray alloc] init];
}else{
    data = [[NSMutableArray alloc] init];   
}   
return data; 

}

我不明白我的问题在哪里?

感谢您的支持

编辑:顺便说一下,我应该提供有关此问题的更多详细信息,此功能(如您所见)正在存储我的对象。我的对象是自定义类并存储在 NSMutableArray 中。

我已经在我的自定义类中添加了这些方法

-(void)encodeWithCoder:(NSCoder *)coder{
-(id)copyWithZone:(NSZone*)zone {
-(id)initWithCoder:(NSCoder *)coder{

【问题讨论】:

    标签: iphone cocoa-touch iphone-sdk-3.0


    【解决方案1】:

    我认为问题很可能出在自定义类的 initWithCoder: 方法中。它正在泄漏,但分析器报告它在存档器中。

    与您的问题无关,我会提醒您不要使用[[NSMutableArray alloc] init] 来初始化集合,尤其是可变集合。请改用[[NSMutableArray alloc] initWithCapacity:1]。我已经看到只使用init 的奇怪问题,使用initWithCapacity 解决了这些问题。

    【讨论】:

    • TechZen 再次感谢您的快速回复。那么,我应该怎么做才能解决我的问题呢?
    • TechZen 看到你的答案后,我研究了 stackoverflow,Stefan von Chossy 已经给出了与我的问题相关的答案,如果有人和我有同样的问题,请看这里:stackoverflow.com/questions/537044/… 在自定义你应该使用的类 -(id)initWithCoder:(NSCoder *)coder{ self = [super init];代替; - (id)initWithCoder:(NSCoder *)coder; { self = [[CustomObject alloc] init];再次感谢您
    • @fyasar 请将您的解决方案作为答案发布,以便我对其进行补充。从self = [[MyObject alloc] init] 切换到self = [super init] 确实解决了 Instruments 中分析报告的泄漏问题。
    猜你喜欢
    • 1970-01-01
    • 2010-09-15
    • 2018-05-19
    • 1970-01-01
    • 2016-07-28
    相关资源
    最近更新 更多