2013-07-08 6 views
1

내가 오토 릴리즈 유명한 방법 stringByAppendingString를 사용하는 샘플 방법의 단점 3 변종을 게시 할 예정입니다 (엑스 코드 4.6.2.IOS 프로젝트에서 비 아크 샘플 프로젝트)stringByAppendingString 및 유지 딜레마

샘플 블록 1 :. 아무 것도 반환하지 않습니다. 이상한 점은 아무것도 가리키지 않습니다. 그러나 null이 아닙니다.
샘플 블록 2 : 아무것도 반환하지 않습니다!.
샘플 블록 3 : A1A2A3을 반환합니다. 예상대로하지만 누수가 있다고 생각합니다.

내 질문 :
a) 샘플 방법 1 예상대로 MAC 프로젝트에서 작동합니다. 그러나 IOS 프로젝트는 아닙니다.
b)는 샘플 블록 3 - 누출을 포함합니까?
c) 샘플 블록 2의 의견을 확인하십시오. word_는 A1, A1A2 및 아무 것도 아닙니다. 왜요?
d) 다른 방법으로 같은 방법으로 자신의 코드를 작성 하시겠습니까?. 안전한 standart 방법을 찾고 있습니다.

감사합니다.


샘플 블록 1

-(NSString*)sampleMethod 
{ 
    NSString *[email protected]""; 
    NSString *[email protected]"A1"; 
    NSString *[email protected]"A2"; 
    NSString *[email protected]"A3"; 

    word_=[word_ stringByAppendingString:a1];// word_ is A1 
    word_=[word_ stringByAppendingString:a2];// word is nothing but another pointer 
    word_=[word_ stringByAppendingString:a3];// word is nothing too but pointer changed. 
    return word_; 
} 

샘플 블록 2

-(NSString*)sampleMethod 
{ 
    NSString *[email protected]""; 
    NSString *[email protected]"A1"; 
    NSString *[email protected]"A2"; 
    NSString *[email protected]"A3"; 

    word_=[word_ stringByAppendingString:a1];// word_ is A1 
    word_=[[word_ stringByAppendingString:a2]retain];// word is A1A2 
    word_=[[word_ stringByAppendingString:a3]retain];// word is nothing ! 
    return word_; 
} 

샘플 블록 3

012,380,333,731,383,


내 답변 : 단지 내가 아무 것도하지 않았기 때문에. 디버그 프로세스 단계에서 변수 값을 매우 세밀하게 수집했습니다.

하지만 어떻게 든 그것은 깨끗한 project.hope 이후 some.or에 대한 시간을 절약 할 수 있습니다 어쩌면 메모리 칩 주소에 뭔가 잘못 됐는지 알고 해결됩니다.

+1

코드에서 수행 할 작업을 중단 점에 넣고 검사하지 않으면 코드에서 말하는대로 수행하지 않으면 정리할 시간입니다. –

+2

FYI, 이것을 쓰는 관용적 인 방법은'NSString * word_ = [NSString stringWithFormat : @ "% @ % @ % @", a1, a2, a3]'입니다. – Chuck

+0

저는 이것이 메모리 관리가 어떻게 작동 하는지를 이해하는 한 예라고 생각합니다. 그렇지 않으면 그는 "A1A2A3"를 반환 할 수 있습니다. –

답변

4

첫 번째 방법은 메모리 관리를 올바르게하는 유일한 방법입니다. 두 번째는 두 개의 누수가 있고 세 번째는 세 개의 NSString 인스턴스입니다. 첫 번째 메소드에서 문자열 "A1A2A3"을 얻지 못하면 오류는 해당 메소드 외부에 있습니다.

보내는 모든 보관 메시지에 대해 메서드 이름이 alloc 또는 copy로 시작하지 않는 한 같은 방법으로 release 또는 autorelease 메시지를 보내야합니다. 이 경우 호출자는 반환 된 객체를 릴리스해야합니다.

+0

샘플 블록 1은 Mac App에서 A1A2A3을 반환합니다. 하지만 IOS에서 emptystring (이상한 포인터를 돌려 준다. 에러는 없지만 emptystring처럼 취급한다.) –

+0

. Im 그것은 악몽이 아니었다라고 확신한다. 나는 가치를 하나씩 수집하고 여기에보고했습니다. 프로젝트를 청소 한 후. 첫 번째 샘플 블록이 예상대로 작동했습니다. 이유를 확신 할 수 없습니다. –

2

두 번째 블록과 세 번째 블록에는 누수가 있습니다. 일반적인 규칙은 소유하고 싶은 것을 보유하고 더 이상 필요하지 않을 때 풀어주는 것입니다. 첫 번째 블록은 완벽하게 훌륭합니다. autoreleased 문자열을 반환합니다. 호출자가 소유하고 싶으면 호출자가 보유하거나 그렇지 않으면 정리 될 첫 번째 자동 릴리스 풀에서 해제됩니다. 두 번째 블록에서

당신이이 일을하고 있습니다 :

word_=[[word_ stringByAppendingString:a2]retain];// word is A1A2 
word_=[[word_ stringByAppendingString:a3]retain];// word is nothing ! 

문자열을 @ "A1A2"가 2의 유지 수를, 그것은 다음 오토 릴리즈 풀 드레인에서 1의 개수를 유지해야하지만 것 당신은 그것에 대한 어떤 언급도 잃어 버렸기 때문에 그것은 누수입니다. @ "A1A2A3"문자열을 유지하는 경우에도 마찬가지로 잘못된 것입니다. 호출자는 보유 여부를 결정합니다.세 번째 블록은 같은 이유로 부정확합니다.

+0

나는 똑같이 느꼈다 : 표본 블록 1은 그것이해야하는 것이다. 하지만 샘플 블록 1은 문제의 결과를 반환합니다. –

+0

아무것도 반환하지 않는다는 것은 무엇을 의미합니까? –

+0

샘플 블록 1은 Mac App에서 A1A2A3을 반환합니다. 하지만 IOS에서 emptystring (어떤 오류도주지 않지만 emptystring처럼 취급하는 이상한 포인터를 반환) –

3

a) 샘플 블록 3은 누출을 포함합니까?

샘플에있는 -retain을 사용할 때마다 예기치 않게 누출이 발생할 수 있습니다.

b) 샘플 블록의 주석을보십시오 .word_는 A1, A1A2 및 아무 것도 아닙니다. 왜요?

다시 확인하십시오.

c) 다른 방법으로 같은 방법으로 자신을 코딩하겠습니까?. 안전한 standart 방법을 찾고 있습니다.

당신은 예를 들어, 변경 가능한 문자열을 사용할 수 있습니다

- (NSString*)sampleMethod 
{ 
    NSMutableString * word = NSMutableString.string; 
    NSString *[email protected]"A1"; 
    NSString *[email protected]"A2"; 
    NSString *[email protected]"A3"; 

    [word appendString:a1]; 
    [word appendString:a2]; 
    [word appendString:a3]; 

    return [NSString stringWithString:word]; 
} 

또는 형식 문자열 :

- (NSString *)sampleMethod 
{ 
    NSString *[email protected]"A1"; 
    NSString *[email protected]"A2"; 
    NSString *[email protected]"A3"; 

    return [NSString stringWithFormat:@"%@%@%@", a1, a2, a3]; 
} 

는 단지 믹스 앤 매치 실제 입력을 기반으로.

+1

NSMutableString.string은 논리적으로 올바르지 않습니다. 도트 표기법은 속성에 액세스하는 데에만 사용해야합니다. –

+1

@RamyAlZuhouri 그건 정말로 당신이 선호하는 코딩 컨벤션이다. – justin

+1

@RamyAlZuhouri : Apple의 문서는 결코 그런 말을하지 않으며 실제로 반대의 예를 제공합니다 (예 :'array.count'). 도트 구문은 선언 된 속성의 일부인지 아닌지 여부에 관계없이 접근자를 호출하는 일반적인 방법입니다. 접근자인 경우 점 표기법을 사용하는 것이 의미 상 정확합니다. – Chuck