0

변경할 수없는 문자열을 만들려고합니다. 나는 초기화, ALLOC 또는 그것을 초기화하고 있지 않다 새로운 여전히 메모리 누수되고 그 말 - 여기 "클래스 NSCFString의 0x234b533이 자리에없는 풀과 오토 릴리즈 객체 단지 누출"나는메모리 누수 문제 NSAutoreleaseNoPool()

NSMutableString *srn = [NSMutableString stringwithCString:devSID]; 

// devSID is *char 
을하려고하고 무엇인가

이 누출이 나뭇잎. 나는, 작동이

NSMutableString *srn = @"this is my string"; 

같은 단순한 문자열로 초기화하려고 주위에 일어나는 무슨 어떤 생각을 가지고 있겠지하지만, 난이 너무

NSMutableString *srn = [NSMutableString stringwithCString:devSID length:sizeof(devSID)]; 

시도했지만이 역시 작동하지 않습니다. 나는 init 또는 alloc을 사용하고 있지 않지만 여전히 누수가있다. 사람이 알아서하는 대신에 오토 릴리즈 풀을하지 않고이 문제를 귀하의 객체를 autoreleasing에 의해 발생

감사

UMAIR

+0

마지막 컴파일러 경고가 표시되지 않습니까? – JeremyP

답변

-1

같은 시도 [[있는 NSString stringWithCString : "안녕하세요"] 유지]

이 유지

당신이 처음에 작성하지 않은 개체에 대한 개체의 소유권을 평가하는 방법이다, 그래서 이것은 릴리스 모든 ALLOC 일치 또는 autorelease를

주 우리의 규칙을 확장 : 당신은 당신의 방출 수의 균형을이 이 객체를 유지하면됩니다. 보관 된 객체를 해제하지 않으면 메모리 누수 문제가 발생합니다.

+0

단지 한 줄만 쓰면 ...이 사람이 내 문제를 해결했습니다 ... 고마워요. – Omayr

+2

'retain'과 나중에'release'의 균형을 유지해야합니다. 그렇지 않으면 메모리가 누출 될 것입니다. – paulbailey

+1

@paul @Omayr 실제로 문제는 그가 할당 된 Autoreleasepool ..에서 autorelease 객체를 만들었다는 것입니다. 그래서 그 객체를 유지할 것을 제안했습니다. 이제는 기능적인 부분으로 끝내 자마자 객체를 해제해야합니다. – Tariq

8

누수를 해결하기 위해 나를 도울 수 있다면 나는 의무가 될 것이다. 이것은 주로 스레드를 만들거나 자신의 스레드를 만들거나 그냥 -performSelectorInBackground:withObject: 편리한 방법을 사용하여 작업을 수행 할 때 발생합니다. autorelease 기능 (여기에서 NSMutableString 클래스 메소드 사용을 암시 함)을 사용하려면 자동 사용 풀을 사용하여 코드 블록의 시작 부분에 자동 사용 풀을 만들어야합니다.이 풀은 마지막에 사용하지 않습니다. 즉,이 라인을 따라 뭔가가 :

- (void)myBackgroundThing:(id)whatever 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    NSMutableString *srn = [NSMutableString stringwithCString:devSID]; 

    // etc... 

    [pool release]; 
} 
+2

autorelease 기능을 사용하고 싶지 않더라도, 많은 코코아 객체가 배경 화면을 그렇게 할 것이므로 백그라운드 스레드 용 풀을 만드는 것이 거의 항상 좋은 생각입니다. –

+2

사실, 참조 횟수가 계산 된 환경에서는 Cocoa를 사용할 모든 스레드에 대해 항상 자동 해제 풀을 만들어야합니다. 독립형 명령 행 도구를 작성하는 경우,'main()'에 자동 해제 풀을 만들어야합니다. – JeremyP

+0

두 가지 사항을 말씀 드리겠습니다. 1) 이미 시도했지만 응용 프로그램이 autoreleasepool 및 release 블록을 삽입하자마자 충돌합니다. 2) NSMutableString과 함께 init을 사용하지 않아서 왜 autoreleasepool이 필요합니까? – Omayr