2009-12-02 5 views
1

에서 올바르게 인 NSMutableString을 반환하는 방법 :내가 인 NSMutableString 피 누출로 구성된 문자열을 반환 할 수있는 좋은 방법을 찾고 있어요 방법

는 예 :

+(NSString *)myMethod{ 



NSMutableString *numberToReturn = [[NSMutableString alloc] init]; 
[numberToReturn appendString:@"lorem ipsum"]; 


return numberToReturn; 
} 

가 누출 악기는 내가 가진 말했다 이 변수로 누출.

autorelease를 시도했지만 충돌이 발생했습니다. mutablestring을 복사하거나 nsstring에 복사했지만 여전히 누수되었습니다.

어떤 아이디어 나 트릭이 있습니까? I'have 당신은 -autorelease를 사용해야합니다

당신에게

답변

12

감사합니다 ... 사용자가 응용 프로그램이 충돌하므로 인해 잘못된 메모리 관리, 텍스트 필드에 값을 입력이 방법을마다 호출합니다. 방법은 다음과 같이 작성해야합니다.

+ (NSString*)myMethod { 
    NSMutableString *stringToReturn = [[NSMutableString alloc] init]; 
    [stringToReturn appendString:@"lorem ipsum"]; 

    return [stringToReturn autorelease]; 
} 

크래시가있는 경우 다른 곳에서 오류가 발생합니다. 물론

, 당신은 분명히

+ (NSString*)myMethod { 
    NSMutableString *result = [NSMutableString stringWithString:@"lorem ipsum"]; 
    //...do something with result; 
    return result; 
} 

당신이 경우,

귀하의 예를 들어 아직
+ (NSString*)myMethod { 
    NSMutableString *result = [NSMutableString string]; 
    [result appendString:@"lorem ipsum"]; 

    return result; 
} 

또는 더 나은 귀하의 방법을 rewritting, 이미 오토 릴리즈 인스턴스를 반환 팩토리 메소드를 사용할 수있다 메서드의 유일한 목적은 문자열로 새 문자열을 반환하는 것입니다. 전체 메서드를 모두 피할 수 있으며 실제로 변경할 수있는 문자열이 필요한 경우 [NSMutableString stringWithString:@"lorem ipsum"]을 사용하십시오.

+1

"충돌이있는 경우 오류는 다른 곳에서 발생합니다." autoreleased 오브젝트를 다른 곳에 공개하지 않도록주의하십시오. 이 메서드에서 반환 된 문자열은 autoreleasepool이 해제 될 때 해제됩니다 (일반적으로 실행 루프의 모든 사이클). 어딘가에 풀어 놓은 다음 autorelease 풀에서 풀을 시도하면 프로그램이 중단됩니다. 객체가 유지 될 때마다 자동으로 릴리즈되거나 해제됩니다. – nash

4

문자열을 반환하기 전에 자동 해제해야합니다. 그것이 바로 the memory management rules입니다. 그런 다음 앱이 다운되면 코드의 다른 곳에서 버그가 있다는 증거가됩니다.