我遇到这种情况:
- (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
一开始,我收到了otherClassString
和classString
的警告,但这样做otherClassString
这项工作。
现在我的问题出在classString
的{{1}}。我尝试了很多东西,但这个警告总是显示出来。我不能在类方法中调用类方法吗?
答案 0 :(得分:8)
您的+otherClassString
创建一个保留计数为1的对象并将其返回。这也用作+classString
的返回值。
如果您的方法不是以init
,new
或copy
开头,则应返回自动释放的对象。在使用你的地方(按原样),他们将被要求返回一个自动释放的物体。
+ (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
// --------------------------