方法泄漏的实例,iPhone
使用仪器执行内存泄漏测试时,以下方法显示为泄漏:方法泄漏的实例,iPhone,iphone,objective-c,xcode,memory-management,memory-leaks,Iphone,Objective C,Xcode,Memory Management,Memory Leaks,使用仪器执行内存泄漏测试时,以下方法显示为泄漏: - (NSDictionary*) initSigTrkLstWithNiv:(int)pm_SigTrkNiv SigTrkSig:(int)pm_SigTrkSig SigResIdt:(int)pm_SigResIdt SigResVal:(int)pm_SigResVal { NSArray *objectArray; NSArray *keyArray; if (self = [super init]) { self.SigT
- (NSDictionary*) initSigTrkLstWithNiv:(int)pm_SigTrkNiv SigTrkSig:(int)pm_SigTrkSig SigResIdt:(int)pm_SigResIdt SigResVal:(int)pm_SigResVal {
NSArray *objectArray;
NSArray *keyArray;
if (self = [super init]) {
self.SigTrkNiv = [NSNumber numberWithInt:pm_SigTrkNiv];
self.SigTrkSig = [NSNumber numberWithInt:pm_SigTrkSig];
self.SigResIdt = [NSNumber numberWithInt:pm_SigResIdt];
self.SigResVal = [NSNumber numberWithInt:pm_SigResVal];
objectArray = [NSArray arrayWithObjects:SigTrkNiv,SigTrkSig,SigResIdt,SigResVal, nil];
keyArray = [NSArray arrayWithObjects:@"SigTrkNiv", @"SigTrkSig", @"SigResIdt", @"SigResVal", nil];
self = [NSDictionary dictionaryWithObjects:objectArray forKeys:keyArray];
}
return self;
}
调用实例的代码:
NSDictionary *lv_SigTrkLst = [[SigTrkLst alloc]initSigTrkLstWithNiv:[[tempDict objectForKey:@"SigTrkNiv"] intValue]
SigTrkSig:[[tempDict objectForKey:@"SigTrkSig"] intValue]
SigResIdt:[[tempDict objectForKey:@"SigResIdt"] intValue]
SigResVal:[[tempDict objectForKey:@"SigResVal"] intValue]];
[[QBDataContainer sharedDataContainer].SigTrkLstArray addObject:lv_SigTrkLst];
[lv_SigTrkLst release];
仪表通知“SigTrkLst”泄漏。即使我已经发布了这个实例?
(我知道将其添加到数组会使重新计数增加1,但释放两次会将其从数组中删除?self=[NSDictionary Dictionary WithObjects:objectArray forKeys:keyArray];
当你这么做的时候,self应该指向的SigTrkLst对象发生了什么?您是否正在丢失对SigTrkLst对象的引用,该对象由self分配并指向?该对象永远不会释放,因为在这一行之后没有对该对象的引用
虽然init方法在技术上可以返回不同类型的对象,但这很可能不是大多数人想要的,并且可能表明存在潜在的bug
编辑:您似乎缺少一些iOS内存管理的基础知识。我强烈要求你阅读。这可能会使您免于许多麻烦。self=[NSDictionary dictionary-withobjects:objectArray-forKeys:keyArray];
当你这么做的时候,self应该指向的SigTrkLst对象发生了什么?您是否正在丢失对SigTrkLst对象的引用,该对象由self分配并指向?该对象永远不会释放,因为在这一行之后没有对该对象的引用
虽然init方法在技术上可以返回不同类型的对象,但这很可能不是大多数人想要的,并且可能表明存在潜在的bug
编辑:您似乎缺少一些iOS内存管理的基础知识。我强烈要求你阅读。这可能会使您避免很多麻烦。您正在初始化实例(
self
),但随后将其替换为字典。假设这是您实际想要做的(参见第2部分),您需要在分配新字典之前释放旧的self
,然后必须保留新字典,以便init
方法保留保留计数。请注意,当调用代码需要一个SigTrkLst
时,此代码返回一个NSDictionary
对象,这几乎肯定是个坏主意
- (NSDictionary*) initSigTrkLstWithNiv:(int)pm_SigTrkNiv
SigTrkSig:(int)pm_SigTrkSig
SigResIdt:(int)pm_SigResIdt
SigResVal:(int)pm_SigResVal {
NSArray *objectArray;
NSArray *keyArray;
if (self = [super init]) {
self.SigTrkNiv = [NSNumber numberWithInt:pm_SigTrkNiv];
self.SigTrkSig = [NSNumber numberWithInt:pm_SigTrkSig];
self.SigResIdt = [NSNumber numberWithInt:pm_SigResIdt];
self.SigResVal = [NSNumber numberWithInt:pm_SigResVal];
objectArray = [NSArray arrayWithObjects:
SigTrkNiv,SigTrkSig,SigResIdt,SigResVal, nil];
keyArray = [NSArray arrayWithObjects:
@"SigTrkNiv", @"SigTrkSig", @"SigResIdt", @"SigResVal", nil];
[self release];
self = [NSDictionary dictionaryWithObjects:objectArray forKeys:keyArray];
[self retain];
}
return self;
}
第二部分:这应该做什么?通常来说,-init…
方法应该返回一个初始化的类实例,从分配的内存块开始。-init
方法的第一部分看起来正确,而不是返回值。例如,以下是正常的-init
方法:
- (id)initSigTrkLstWithNiv:(int)pm_SigTrkNiv
SigTrkSig:(int)pm_SigTrkSig
SigResIdt:(int)pm_SigResIdt
SigResVal:(int)pm_SigResVal {
if (self = [super init]) {
self.SigTrkNiv = [NSNumber numberWithInt:pm_SigTrkNiv];
self.SigTrkSig = [NSNumber numberWithInt:pm_SigTrkSig];
self.SigResIdt = [NSNumber numberWithInt:pm_SigResIdt];
self.SigResVal = [NSNumber numberWithInt:pm_SigResVal];
}
return self;
}
您正在初始化实例(
self
),但随后将其替换为字典。假设这是您实际想要做的(参见第2部分),您需要在分配新字典之前释放旧的self
,然后必须保留新字典,以便init
方法保留保留计数。请注意,当调用代码需要一个SigTrkLst
时,此代码返回一个NSDictionary
对象,这几乎肯定是个坏主意
- (NSDictionary*) initSigTrkLstWithNiv:(int)pm_SigTrkNiv
SigTrkSig:(int)pm_SigTrkSig
SigResIdt:(int)pm_SigResIdt
SigResVal:(int)pm_SigResVal {
NSArray *objectArray;
NSArray *keyArray;
if (self = [super init]) {
self.SigTrkNiv = [NSNumber numberWithInt:pm_SigTrkNiv];
self.SigTrkSig = [NSNumber numberWithInt:pm_SigTrkSig];
self.SigResIdt = [NSNumber numberWithInt:pm_SigResIdt];
self.SigResVal = [NSNumber numberWithInt:pm_SigResVal];
objectArray = [NSArray arrayWithObjects:
SigTrkNiv,SigTrkSig,SigResIdt,SigResVal, nil];
keyArray = [NSArray arrayWithObjects:
@"SigTrkNiv", @"SigTrkSig", @"SigResIdt", @"SigResVal", nil];
[self release];
self = [NSDictionary dictionaryWithObjects:objectArray forKeys:keyArray];
[self retain];
}
return self;
}
第二部分:这应该做什么?通常来说,-init…
方法应该返回一个初始化的类实例,从分配的内存块开始。-init
方法的第一部分看起来正确,而不是返回值。例如,以下是正常的-init
方法:
- (id)initSigTrkLstWithNiv:(int)pm_SigTrkNiv
SigTrkSig:(int)pm_SigTrkSig
SigResIdt:(int)pm_SigResIdt
SigResVal:(int)pm_SigResVal {
if (self = [super init]) {
self.SigTrkNiv = [NSNumber numberWithInt:pm_SigTrkNiv];
self.SigTrkSig = [NSNumber numberWithInt:pm_SigTrkSig];
self.SigResIdt = [NSNumber numberWithInt:pm_SigResIdt];
self.SigResVal = [NSNumber numberWithInt:pm_SigResVal];
}
return self;
}
我用“@interface SigTrkLst:NSDictionary”将self设置为NSDictionary类型,或者这不是您的意思?这不是正确的方式。通过调用dictionaryWithObject,您正在创建一个新字典,而不是修改当前的SigTrkLst。我建议您不要将SigTrkLst作为NSDictionary的子类,只需向SigTrkLst添加一个dictionary属性,如NSNumbers,然后在需要时使用self.myDict。我已将子类更改为NSObject,并按照您的建议向类添加了一个NSDictionary属性,效果很好。谢谢我用“@interface SigTrkLst:NSDictionary”将self设置为NSDictionary类型,或者这不是您的意思?这不是正确的方式。通过调用dictionaryWithObject,您正在创建一个新字典,而不是修改当前的SigTrkLst。我建议您不要将SigTrkLst作为NSDictionary的子类,只需向SigTrkLst添加一个dictionary属性,如NSNumbers,然后在需要时使用self.myDict。我已将子类更改为NSObject,并按照您的建议向类添加了一个NSDictionary属性,效果很好。谢谢SigTrkLst的意思是作为NSDictionary中的一个子类。我认为我的代码会因此期待一个词汇表。我意识到这是完全错误的,你的解释让我明白了这一点。您的解决方案也是有效的。SigTrkLst是NSDictionairy中的一个子类。我认为我的代码会因此期待一个词汇表。我意识到这是完全错误的,你的解释让我明白了这一点。你的解决方案也是有效的。