Недавно я переписал некоторый код в одном из моих классов, который дал мне ошибку с NSString. Вот что у меня сейчас:
Заголовок моего класса:
@interface MyViewController : UITableViewController {
NSString *myString;
}
@property (nonatomic, retain) NSString *myString; // Or copy instead of retain.
@end
И реализовано несколько методов:
- (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.
}
}
После некоторой отладки я решил сохранить / скопировать строку NSString.
Почему я должен сохранять / копировать строку NSString в viewDidLoad, если я хочу использовать ее позже?
Кроме того, я заметил, что если я удалю строку, помеченную * 1, мне не нужно сохранять / копировать.