存储的潜在泄漏值从未在 NSMutableArray 中读取

potential leak value stored never read in NSMutableArray

注意:我想分配我的 NSMutableArray,然后在其中分配数据。

我在下面的代码中泄漏了

NSMutableArray *responseArr=[[NSMutableArray alloc]init];
                responseArr =[response valueForKey:@"result"];

同样在这里存储的值从未被读取

 NSString *name=_txt_name.text;
    if ([name length]==0) {
        name=@"";
    }

下面也漏了

 NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];
    [dateFormatter setDateFormat:@"dd/MM/yyyy HH:mm:ss"];

    //below here i get leak 
    NSDate *dateStart = [[NSDate alloc] init];
    dateStart = [dateFormatter dateFromString:startDate];

编辑 :
我在可达性 Class 中使用 -fno-objc-arc 禁用了 ARC,即使我低于泄漏

这一行

NSMutableArray *responseArr=[[NSMutableArray alloc]init];

分配一个新的 NSMutableArray 并将其引用分配给 responseArr

这一行

responseArr = [response valueForKey:@"result"];

从字典中获取一个值(大概是对 NSMutableArray 的引用)并将其分配给 responseArr。此时不再有对您分配的原始 NSMutableArray 的引用,因此它将被释放。

你可以直接说:

 NSMutableArray *responseArr = (NSMutableArray *)response[@"result"];

与您的日期代码类似,您可以只说:

NSDate *dateStart = [dateFormatter dateFromString:startDate];

不用赋初值,直接扔掉就行了。

假设您使用的是 ARC,

None 您显示的代码将导致泄漏。

如果您不使用 ARC,请开始使用 ARC!

一个。第一个片段

使用 MRC (MRR),您必须平衡分配与 +alloc 您自己的分配:

NSMutableArray *responseArr = [[NSMutableArray alloc]init];
                responseArr = [response valueForKey:@"result"];

在第一行你分配了一个NSArray的实例。您必须稍后(自动)释放它,否则就是内存泄漏。我认为您误解了您使用 -valueForKey 创建了 NSArraynew 实例并将此新引用的值分配给 responseArr。 (因此你不需要可变数组。)之后你创建了两个对象,只有一个对新对象的引用,你永远不能释放旧对象。

做这样的事情:

NSArray *responseArr = [[NSArray alloc]init];
NSArray *resultArr =[response valueForKey:@"result"];
[responseArr release]; 

您不必对 resultArr 引用的对象执行此操作,因为它不是使用 +alloc-init 创建的。 Here 您将了解所有权。

乙。第三个片段

同上例:

NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init];

你 +alloc-init 那个实例对象,但是你的代码中没有release。因此,当引用 dateFormatter 失去其范围(生命周期)时,它不能再被释放,即。 e.从方法返回。

在方法末尾添加这段代码:

[dateFormatter release];

摄氏度。第二个片段

第二个示例有一个不同的问题:您为 var name 赋值,而没有在下面的代码中使用该变量。所以赋值是没有意义的。