潜在的泄漏值永远不会读取NSMutableArray

问题描述:

注:我想分配我的NSMutableArray,然后在其中分配数据。潜在的泄漏值永远不会读取NSMutableArray

我有泄漏在下面的代码

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

此外,在存储在这里的值从来没有读过

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

而且漏下面

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]; 

编辑
我有禁用ARC使用可达性类-fno-objc弧甚至低于我得到泄漏

enter image description here

+0

什么是错误? – Paulw11

+0

对不起有泄漏没有错误 – iphonemaclover

+0

没有任何代码显示导致泄漏的原因。如果您创建了变量然后从不读取它们,您将会收到警告;编译器警告你,你正在执行不必要的操作 – Paulw11

此行

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

分配一个新的NSMutableArray和分配引用来responseArr

这line

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

从字典中获取值(大概是对NSMutableArray的引用)并将其指定为responseArr。此时不再提及您分配的原始NSMutableArray,因此它将被解除分配。

你可以只说:

NSMutableArray *responseArr = (NSMutableArray *)response[@"result"]; 
与日期代码

同样,你可以只说:

NSDate *dateStart = [dateFormatter dateFromString:startDate]; 

没有必要指定一个初始值,只把它扔掉。

假设您正在使用ARC,所显示的任何代码都不会导致泄漏。

如果你不使用ARC,那么开始使用ARC!

+0

他没有使用ARC。 –

+0

hello @paulw is NSMutableDictionary * Data = [NSMutableDictionary new]; Data =(NSMutableDictionary *)[arrData objectAtIndex:indexPath.row]; Is equivalent => NSMutableDictionary * Data =(NSMutableDictionary *)[arrData objectAtIndex:indexPath.row]; – iphonemaclover

+0

种。在第一种情况下,您不必分配,然后丢弃字典。在第二种情况下,您不是,但是在两种情况下'数据'将具有相同的值 – Paulw11

A.第一个片段

使用MRC(MRR)你有+alloc自己来平衡分配:

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

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

做这样的事情:

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

你不必做与resultArr提到,因为它不与+alloc-init创建的对象。 Here你得到一个所有权的介绍。

B.第三片断

这是最后一个例子是相同的:

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

你+的alloc-init用于实例对象,但没有释放你的代码。因此,当参考文献dateFormatter失去其范围(生命周期)时,它不能再被释放,即从方法返回。

在方法结束时添加以下代码:

[dateFormatter release]; 

C.第二代码段

第二实例具有不同的问题:您的值分配给该VAR name不使用在可变下面的代码。所以分配值是没有意义的。