2011-11-16 6 views
0

최근에 내 수업 중 하나에 코드를 다시 작성하여 NSString에 오류가 발생했습니다. 나는 내가있는 NSString을/유지 복사했다 생각 디버깅 후왜이 NSString을 유지/복사해야합니까?

- (void)viewDidLoad { 
    myString = @"This is"; 

    if (something) { 
     myString = [NSString stringWithFormat:@"%@ a string.", myString]; // *1 
    } 

    [myString retain]; // <-- Why do I have to retain/copy here? 
} 

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 
    if (indexPath.row == 0) { 
     /* Some code for creating a UITextView called myTextView */ 
     // ..and then setting the text property: 
     myTextView.text = myString; // <-- Crashes here if I don't retain/copy in viewDidLoad. 
    } 
} 

: 몇 가지 방법을

@interface MyViewController : UITableViewController { 
    NSString *myString; 
} 

@property (nonatomic, retain) NSString *myString; // Or copy instead of retain. 

@end 

및 구현 :

내 클래스 헤더 : 여기에 내가 지금 가지고있는 것입니다.

나중에 NSString을 viewDidLoad에 유지/복사해야하는 이유는 무엇입니까?

또한 * 1로 표시된 줄을 제거하면 유지/복사 할 필요가 없습니다. 당신이 변수를 할당 합성 된 setter 메소드를 사용하는 경우

답변

1

, 자동으로 당신을위한 NSString 유지합니다 :

if (something) { 
    self.myString = [NSString stringWithFormat:@"%@ a string.", myString]; // *1 
} 
+0

감사합니다. – matsr

1

한 가지 방법은 당신이 더이 밑줄로 개인 속성을 접두사하는 것 이해하기 _myString 및 속성을 myString으로 유지하십시오. 사용중인 속성이나 속성을 쉽게 처리 할 수 ​​있습니다.

클래스의 값을 사용하는 것처럼 보일 뿐이므로이 속성이 혼란의 원인이라고 생각하는 이유는 무엇입니까?

접두어를 붙이면 _myString이 할당되었을 때 _myString이 보유해야하고 myString이 자동으로 유지된다는 것을 항상 알 수 있습니다.

* 1의 줄이 myString의 값을 새 문자열로 바꾸고 있으며 어떤 이유로이 값은 두 번째 방법의 코드가 처리되기 전에 자동으로 변환됩니다. 나는 정확한 이유를 기억하지 못하지만 자동 할당되지 않은 @ "This is"로 문자열 리터럴을 작성하기 때문에 첫 번째 할당에 대해서는 이것이 발생하지 않는다고 생각합니다.

이 정보가 도움이되기를 바랍니다. 당신이 표시된 라인을 제거 할 때

0

은 자동

- (void)viewDidLoad { 
    self.myString = @"This is"; 
    if (something) { 
     self.myString = [NSString stringWithFormat:@"%@ a string.", myString]; // *1 
    } 
    // no need to retain 
} 

이유가 충돌하지 않는 유지/해제 할 유지 속성 접근을 사용할 수 있습니다 * mystring에 여전히를 인 @"This is" 가리키는 때문에 1이다 litteral은 프로그램의 전체 기간 동안 메모리 모서리에 있으며 결코 파괴되지 않으므로 메모리 위치는 유효합니다.