NSMutableDictionary не может иметь «время» для чтения объектов (NSMutableString s) - PullRequest
1 голос
/ 03 июня 2010

Я устанавливаю текст меток с содержимым NSMutableString_s, которые являются объектами NSMutableDictionray ... проблема в том, что все работает нормально, когда я загружаю страницу два раза (поэтому я нажимаю, после того, как я выскочил .. .) и с третьим нажатием программа не может прочитать содержимое одного из NSMutableString_s NSMutableDictionary..so, когда она поворачивается к шагу установки значения UILabel, она не нашла значение ...

есть код, где появляется исключение:

- (void)viewDidLoad{
    [super viewDidLoad];
    NSMutableDictionary *item=[days objectAtIndex:0];
    NSString *title1=[item objectForKey:@"week_day"];
    name1.text=title1;
    [title1 release];

Ответы [ 2 ]

1 голос
/ 04 июня 2010

Вы не должны выпускать title1 - вам не принадлежит строка, возвращенная -objectForKey:, и вы не стали владельцем, сохранив ее.
Я предлагаю прочитать Руководство по управлению памятью какао , чтобы предотвратить это в будущем.

Предполагая, что text является свойством retain: для изменяемых строк вы должны назначить копии строки, чтобы избежать их изменения под вами:

NSString *title1 = [[item objectForKey:@"week_day"] copy];
name1.text = title1;
[title1 release]; // copy means taking ownership, so release

Ниже приведен упрощенный пример того, что может происходить с вашим кодом в опубликованном виде:

// entering -viewDidLoad the first time:
NSString *title1=[item objectForKey:@"week_day"];
// lets assume that the strings retain count is 1 here
name1.text=title1;
// setter retains, retain count now 2
[title1 release];
// retain count now 1

// entering -viewDidLoad the second time:
NSString *title1=[item objectForKey:@"week_day"];
// assuming nothing else did retain it, strings retain count is still 1
name1.text=title1;
// you assigned the same object, retain count still 1
[title1 release];
// strings retain count now 0 - will be deallocated :(
0 голосов
/ 04 июня 2010

Спасибо всем, теперь он работает нормально, когда я избегаю перехода с промежуточными переменными, но я не понял, почему он работает для двух "проталкивающих" действий раньше !!!

name1.text=[[days objectAtIndex:0] objectForKey:@"week_day"];
...