UITableView падает при прокрутке при использовании XML plist - PullRequest
0 голосов
/ 01 апреля 2011

Я читал в течение нескольких часов, искал документацию Apple, stackoverflow, не могу понять, что я делаю неправильно ....

когда я использую эти данные из XML-списка на моем UITableViewController:

- (void)viewDidLoad
    {
        [super viewDidLoad];

        NSString *path = [[NSBundle mainBundle] pathForResource:@"arrayofstrings"
                                                             ofType:@"plist"];
        NSData *myData = [NSData dataWithContentsOfFile:path];
        NSString *error;
        NSPropertyListFormat format;

        myArray = [NSPropertyListSerialization propertyListFromData:myData
                                                       mutabilityOption:NSPropertyListImmutable
                                                                 format:&format
                                                       errorDescription:&error];
    }

мое табличное представление показывает первые видимые строки просто отлично, но вылетает при попытке прокрутки.

этого не происходит, когда вместо данных XML я использую что-то вроде этого:

- (void)viewDidLoad
        {
            [super viewDidLoad];

        myArray = [[NSArray alloc] initWithObjects:@"thing1", @"thing2", @"thing3", @"thing4", @"thing5",@"thing6", @"thing7", @"thing8", @"thing9", @"thing10", 
            @"thing11",@"thing12", @"thing13", @"thing14", nil];

        }

таким образом, просмотр таблицы просто отлично. в чем моя проблема ?! Предполагается ли преобразование plist в массив другим способом?

Ответы [ 2 ]

0 голосов
/ 01 апреля 2011

Проблема в том, что в первом случае ваш вызов [NSPropertyListSerialization propertyListFromData: возвращает NSArray без счетчика хранения (обратите внимание, что метод не имеет alloc, new или copy в имени) - и тогда вы не 'сохранить этот NSArray.Следовательно, вскоре после этого массив освобождается, и ваш код аварийно завершает работу, пытаясь получить доступ к мусорной памяти.

Во втором случае вы создаете NSArray, используя alloc - это возвращает NSArray с сохраненным счетчиком1, что означает, что он не освобожден (пока не будет вызван релиз).

Чтобы это исправить, в первом случае вы хотите назначить массив следующим образом:

self.myArray = ...

self. является важной частью здесь (при условии, что вы объявили свойство myArray как retain).

Существует множество ресурсов и сообщений в блоге , касающихся управления памятью.

0 голосов
/ 01 апреля 2011
- (void)viewDidLoad
    {
        [super viewDidLoad];

        NSString *path = [[NSBundle mainBundle] pathForResource:@"arrayofstrings"
                                                             ofType:@"plist"];
        NSData *myData = [NSData dataWithContentsOfFile:path];
        NSString *error;
        NSPropertyListFormat format;

        myArray = [[NSPropertyListSerialization propertyListFromData:myData
                                                       mutabilityOption:NSPropertyListImmutable
                                                                 format:&format
                                                       errorDescription:&error] retain];
    }

Возвращаемое значение из propertyListFromData:mutabilityOption:format:errorDescription равно autorelease d.Убедитесь, что вы вызываете retain, чтобы он не высвобождался из-под вас в конце текущего цикла выполнения.

Второй метод работает, потому что создание NSArray с alloc/init оставляет массив ссохранить счет 1.

...