存储的潜在泄漏值从未在 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
创建了 NSArray
的 new 实例并将此新引用的值分配给 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
赋值,而没有在下面的代码中使用该变量。所以赋值是没有意义的。
注意:我想分配我的 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
创建了 NSArray
的 new 实例并将此新引用的值分配给 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
赋值,而没有在下面的代码中使用该变量。所以赋值是没有意义的。