2011-10-25 5 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 

は、私がotherClassStringためとclassStringの警告があったが、otherClassStringため、この方法でこの作品。

私の問題は、のclassStringにあります。私はたくさんのことを試みましたが、この警告は常に表示されます。クラスメソッド内でクラスメソッドを呼び出すことはできませんか?

答えて

8

あなた+otherClassStringは、カウント1を保持し、それを返してオブジェクトを作成します。これは+classStringの戻り値としても使用されます。

メソッドがinitnew、またはcopyで始まらない場合は、自動解放されたオブジェクトを返す必要があります。あなたのものが使われているところでは、オートレリースされたオブジェクトを返すことが期待されます。

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

笑、溶液は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を使用する場合、自動解放は必要ありません。 –

+0

私はあなたの答えを投票しませんでしたが、私は、あなたがARCを使用していない場合にはかなり効果があるアナライザーによって、 "ライン上に割り当てられたオブジェクトの潜在的なリーク..."しかし、私にはそれは下位投票ではないコメントです。 – NJones

1

あなたの問題は、これに沸く:あなたは、命名規則によって、自動解放オブジェクトを返すべきであるが、代わりに、それは保持オブジェクトを返すのメソッドを持っています。その方法は+otherClassStringです。次のように変更してください:

+ (NSString *)otherClassString { 
    NSString *result = [[NSString alloc] initWithString:@"Hello World"]; 
    return [result autorelease]; 
} 
関連する問題