方法泄漏的实例,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中的一个子类。我认为我的代码会因此期待一个词汇表。我意识到这是完全错误的,你的解释让我明白了这一点。你的解决方案也是有效的。