Почему NSString становится пустым (без причины)? - PullRequest
0 голосов
/ 22 августа 2011

Я схожу с ума от цели C. Пожалуйста, посмотрите на следующий код.

FirstViewController.h:

@interface FirstViewController : UIViewController {
    IBOutlet UITextView *textView;
    IBOutlet UIBarButtonItem *button;
    NSString* superString;
}

- (IBAction)buttonDown;

FirstViewController.m:

- (void)viewDidLoad {
    [super viewDidLoad];
    superString = [NSString stringWithFormat:"%@", @"A_super_string_file.txt"];
    [self buttonDown];
}

- (IBAction)buttonDown {
    NSError* err = nil;
    NSString* text = [NSString stringWithContentsOfFile:superString encoding:NSUTF8StringEncoding error:&err];
    [textView setText:text];
}
  1. Запустите приложение.A_super_string_file.txt успешно отображается в textView.
  2. Нажмите кнопку.Приложение аварийно завершает работу, потому что superString ссылается на тот же адрес, что и на шаге 1, но в этом адресе есть другая переменная или ничего нет.Print Description на superString не отображает ничего или случайную другую переменную (может быть даже другого типа).

Что происходит?Я разработчик навыков, но понятия не имею в этом случае.Большое спасибо за помощь!

ОБНОВЛЕНИЕ: Возможно, это скрытый авто-релиз в работе.Но когда он освобождает память?Каждый раз в другой момент или в какой-то конкретный момент?

Ответы [ 2 ]

4 голосов
/ 22 августа 2011

NSString s + stringWithFormat: автоматическое освобождение.Вы должны сохранить его, если хотите, чтобы он оставался рядом.

Свойства - это хороший способ сделать это, потому что он сокращает объем управления памятью, о котором вам нужно беспокоиться.ч

@interface FirstViewController : UIViewController {
    IBOutlet UITextView *textView;
    IBOutlet UIBarButtonItem *button;
    NSString* superString;
}

@property (nonatomic, copy) NSString* superString;

- (IBAction)buttonDown;

@synthesize superString

- (void)viewDidLoad {
    [super viewDidLoad];
    [self setSuperString:[NSString stringWithFormat:"%@", @"A_super_string_file.txt"]];
    [self buttonDown];
}

- (IBAction)buttonDown {
    NSError* err = nil;
    NSString* text = [NSString stringWithContentsOfFile:superString encoding:NSUTF8StringEncoding error:&err];
    [textView setText:text];
}

- (void)dealloc {
    [superString release];
    [super dealloc];
}
1 голос
/ 22 августа 2011

Вам нужно сохранить SuperString.

[superString retain];

сразу после создания.

и затем отпустите его в dealloc.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...