2010-04-01 2 views
6

지금이 코드를 조금보고 있었는데이 간단한 코드가 왜 오류를 던지고 있는지 이해하지 못했습니다. 간략히 요약하면 :NSMutableString에 문자열 추가

NSMutableString *output; 

... 

@property (nonatomic, retain) NSMutableString *output; 

... 

@synthesize output; 

... 

// logs "output start" as expected 
output = [NSMutableString stringWithCapacity:0]; 
[output appendString:@"output start"]; 
NSLog(@"%@", output); 

... 

// error happens here 
// this is later on in a different method 
[output appendString:@"doing roll for player"]; 

누구든지 내 실수를 감지 할 수 있습니까?

+0

정확한 오류 란 무엇인가요? – outis

답변

1

사용자가 invariant으로 표시된 바와 같이 솔루션은 실제로 보유와 관련이 있습니다. 클래스 메서드 :

output = [NSMutableString stringWithCapacity:0]; 

autorelease NSMutableString을 반환합니다. 내 출력 속성에 할당 된 경우 - 겉으로보기에는 유지 플래그가있는 경우에도 유지되지 않았습니다. 해결 방법은 자동 채우기가 아니라 자동 할당입니다.

output = [[NSMutableString alloc] initWithCapacity:0]; 

그런 다음 유지가 수행되었습니다. 그 이유에 대한 설명은 대단히 환영 할 것입니다.

편집하는 것은

이유를 나타냈다. 내가 합성 한 getter/setter 대신에 직접 인스턴스 변수에 액세스하고있었습니다. 내 blog에 대한 자세한 정보.

+0

AppleDevForums의 Rufus가 나와 비슷한 점에 대해 나에게 꽤 좋은 대답을주었습니다. – Emil

+1

매우 혼란스럽고, 마침내 이해하기 위해 알아야 할 7-8 가지 것들은 같은 장소에 없습니다. 먼저,'self.foo = bar;'는'[self setFoo : bar]; 구문의 바로 가기와 똑같습니다. 즉, "setFoo : bar' 메서드를 호출하십시오." 나 (이 물체)에. " 이제 스스로에게 물어볼 것입니다. "응? 나는"setFoo "방법을 쓰지 않았다." 사실, 그렇지 않았습니다. @synthesize 지시어는 컴파일러에게 "setFoo"메소드를 작성하도록 지시했다. – Emil

+0

그리고 컴파일러는 당신을 위해 작성한이 메소드의 소스 코드를 제공하지 않습니다. 그러나이 숨겨진 "setFoo :"메소드는 무엇을합니까? 1. "bar"가 이미 "foo"로 설정되어 있는지 확인합니다. 2. 그렇지 않은 경우 "foo"에 "release"메시지를 보냅니다. 3. "foo"포인터를 "bar"포인터로 설정합니다. 4. "retain"메시지를 "foo" "foo"에 대한 @property 지시문은 이렇게 말했습니다.) – Emil

2

변경

[self setOutput:[NSMutableString stringWithString:@"output start"]]

에 선

output = [NSMutableString stringWithString:@"output start"]

(또는 self.output = ... 당신이 표기 것을 선호하는 경우).

속성을 선언했지만 설정자를 사용하지 않아 문자열을 유지하지 못합니다.

+0

정말요? 허, 잘 알고있어. 나는 변수를 @ 합성 할 때 나를 위해 그렇게한다고 생각했다. – typeoneerror