【问题标题】:Class methods and "Potential leak of an object allocated on line..."类方法和“在线分配的对象的潜在泄漏......”
【发布时间】:2011-10-25 00:07:43
【问题描述】:

我有这种情况:

- (void) foo {
    NSLog(@"Print this: %@", [MyObject classString]);
}

// So in MyObject.m I do
@implementation MyObject

+ (NSString *) classString {
     return [OtherObject otherClassString];   //The Warning "Potential leak..." is for this line
}
@end

// Finally in OtherObject
@implementation OtherObject

+ (NSString *) otherClassString {
    NSString *result = [[NSString alloc] initWithString:@"Hello World"];
    return result;
}
@end

一开始,我对otherClassStringclassString 有一个警告,但对于otherClassString 来说,这种方式可以工作。

现在我的问题是在MyObject 中的classString。我尝试了很多东西,但总是显示这个警告。不能在类方法里面调用类方法吗?

【问题讨论】:

    标签: objective-c class memory-leaks class-method


    【解决方案1】:

    您的 +otherClassString 创建一个保留计数为 1 的对象并将其返回。这也用作+classString 的返回值。

    如果您的方法不是以initnewcopy 开头,您应该返回自动释放的对象。在任何使用你的(原样)的地方,它们都会返回一个自动释放的对象。

    + (NSString *) otherClassString {
        NSString *result = [[[NSString alloc]
                                initWithString:@"Hello World"]
                                autorelease];
        return result;
    }
    

    【讨论】:

    • 大声笑,解决方案是把 autorelease 放在 2 函数中。你的规则有效!
    【解决方案2】:

    您的问题归结为:您有一个方法,按照命名约定,它应该返回一个自动释放的对象,但它返回的是一个保留的对象。那个方法是+otherClassString。将其更改为以下内容:

    + (NSString *)otherClassString {
        NSString *result = [[NSString alloc] initWithString:@"Hello World"];
        return [result autorelease];
    }
    

    【讨论】:

      【解决方案3】:

      我已经准确地重现了您的场景,并且没有出现错误或警告。也许你的头文件有问题。这是我的代码(Xcode 4.2 和 iOS5):

      // myObject.h
      #import <Foundation/Foundation.h>
      #import "otherObject.h"
      
      @interface myObject : NSObject
      
      + (NSString *) classString;
      @end
      // --------------------------
      // myObject.m
      #import "myObject.h"
      @implementation myObject
      
      + (NSString *) classString {
          return [otherObject otherClassString];   
      }
      
      @end
      
      // otherObject.h
      #import <Foundation/Foundation.h>
      
      @interface otherObject : NSObject
      
      + (NSString *) otherClassString;
      
      @end
      
      // otherObject.m
      #import "otherObject.h"
      
      @implementation otherObject
      
      + (NSString *) otherClassString {
          NSString *result = [[NSString alloc] initWithString:@"Hello World"];
          return result;
      }
      
      @end
      // --------------------------
      

      【讨论】:

      • 看不懂反对票。如果使用 ARC,则不需要自动释放。
      • 我没有否决你的回答,但我可以告诉你警告“在线分配的对象的潜在泄漏......”是由分析器发出的,它几乎只有在你不使用ARC。但对我来说,这是评论而不是反对票。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-05
      • 1970-01-01
      相关资源
      最近更新 更多