类方法和“在线分配的对象的潜在泄漏......”

时间:2011-10-25 00:07:44

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

我遇到这种情况:

- (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这项工作。

现在我的问题出在classString的{​​{1}}。我尝试了很多东西,但这个警告总是显示出来。我不能在类方法中调用类方法吗?

3 个答案:

答案 0 :(得分:8)

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

如果您的方法不是以initnewcopy开头,则应返回自动释放的对象。在使用你的地方(按原样),他们将被要求返回一个自动释放的物体。

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:-1)

我完全重现了你的场景,没有出现任何错误或警告。也许你的头文件有问题。这是我的代码(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
// --------------------------