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 

을, 나는 otherClassStringclassString뿐만 otherClassString이 방법을 경고했다 이 일.

이제 내 문제는 의 classString에 있습니다. 나는 많은 것을 시도했지만,이 경고는 항상 나타납니다. 클래스 메서드 내에서 클래스 메서드를 호출 할 수 있습니까?

답변

8

귀하의 +otherClassString이 카운트 1을 유지 가진 객체를 생성하고 리턴 : 여기 내 코드 (Xcode의 4.2 iOS5를이)입니다. 이것은 +classString에 대한 반환 값으로도 사용됩니다.

메소드가 init, new 또는 copy으로 시작하지 않으면 자동 릴리즈 된 객체를 반환해야합니다. 귀하의 (있는 그대로) 사용되는 모든 곳에서 자동 발표 된 객체를 반환해야합니다.

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

Lol, 솔루션은 자동 응답 기능에 배치됩니다. 너의 규칙 일! – Rodrigo

-1

시나리오를 정확하게 재현했으며 오류나 경고가 발생하지 않았습니다. 헤더 파일에 문제가있을 수 있습니다.

// 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]; 
}