[objective-c]漏水,iPhone 的方法的实例

发布时间: 2017/3/27 3:57:15
注意事项: 本文中文内容可能为机器翻译,如要查看英文原文请点击上面连接.

下面的方法显示为泄漏与文书执行内存泄漏测试时︰

- (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 retainCount,但两次释放它从数组中移除吗?)

解决方法 1:

你正在初始化实例 ( self ),但然后替换一本字典。假设这就你真正想要做 (见第 2 部分),你需要释放旧的 self 分配一个新的然后你必须保留新字典之前,你 init 方法保留的保留计数。请注意,此代码将返回 NSDictionary 对象,当您调用的代码预计 SigTrkLst ,这几乎可以肯定是一个糟糕的主意。

- (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;
}

第 2 部分︰这是什么应该呢?一般来说, -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;
}
官方微信
官方QQ群
31647020