2011-10-25 139 views
2

我有這樣的情況:類的方法和「上線分配對象的潛在泄漏......」

- (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。我嘗試了很多東西,但始終顯示此警告。我不能在類方法中調用類方法嗎?

回答

8

+otherClassString創建了保留計數1對象並將其返回。這也用作+classString的返回值。

如果您的方法不是以init,newcopy開頭,則應該返回自動釋放對象。在任何你使用的地方,他們都會被要求返回一個自動釋放對象。

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

大聲笑,解決方案是把autorelease在2函數中。你的規則工作! – Rodrigo

-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 
// -------------------------- 
+0

無法理解否定的投票。如果使用ARC,則不需要autorelease。 –

+0

我沒有投下你的答案,但我可以告訴你,警告「在線上分配的對象的潛在泄漏......」是由分析器製作的,它非常適用於不使用ARC的情況。但對我來說,這是一個評論,而不是反對票。 – NJones

1

你的問題歸結爲:你有一個方法,該方法,通過命名慣例,應該返回一個自動釋放的對象,而是它返回了保留對象。該方法是+otherClassString。將其更改爲以下內容:

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