Цель C - UITableView после вызова reloadData мои свойства объекта имеют значение null / nil - PullRequest
0 голосов
/ 09 октября 2010

У меня ViewController определен следующим образом:

@interface SectionController : UITableViewController {
   NSMutableArray *sections;
}
- (void) LoadSections;

Когда LoadSection вызывается, он вызывает NSURLConnection для загрузки URL, который, в свою очередь, вызывает

    - (void)connectionDidFinishLoading:(NSURLConnection *)connection {
    NSString *responseString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];

    [connection release];
    [responseData release];

    NSDictionary *results = [responseString JSONValue];
    NSMutableArray *jSections = [results objectForKey:@"Items"];
    sections = [NSMutableArray array];

    for (NSArray* jSection in jSections)
    {
        Section* section = [Section alloc];
        section.Id = [jSection objectForKey:@"Id"];
        section.Description = [jSection objectForKey:@"Description"];
        section.Image = [jSection objectForKey:@"Image"];
        section.Parent = [jSection objectForKey:@"Parent"];
        section.ProductCount = [jSection objectForKey:@"ProductCount"];
        [sections addObject:section];
        [section release];
    }

    [jSections release];
    [results release];

    [delegate sectionsLoaded];

    [self.view reloadData];
}

Данные анализируются правильно, и теперь у меня есть разделы , заполненные многими элементами.

Вызов [self.view reloadData] инициирует обратный вызов метода делегата cellForRowAtIndexPath, который затем должен представить данные в ячейку, однако в этот момент section теперь снова равен nil.

Может кто-нибудь указать на мою ошибку? Я должен признать, что я новичок в цели c, и это, вероятно, проблема указателя. Что нужно сделать, так это сохранить значение разделов после вызова reloadData.

Большое спасибо.

Ответы [ 2 ]

1 голос
/ 09 октября 2010

Видя новый код, проблема очевидна:

sections = [NSMutableArray array];

должно стать

[sections release];
sections = [[NSMutableArray alloc] init];

обратите внимание, что массив не становится снова "ноль", вместо этого он освобождается, и вы получаетенедопустимая ссылка, которая может (должна) вызвать сбой при разыменовании.

Я предлагаю вам прочитать некоторые статьи об управлении памятью с подсчетом ссылок, поскольку это может быть неочевидно, если вы новичок в Objective-C, и частоприводит к ошибке (то есть: авто-релиз совсем не волшебен)

0 голосов
/ 17 декабря 2012

лучший способ избежать всех утечек памяти здесь - просто использовать @property (nonatomic, retain) NSMutableArray *sections;, используя свойство, и вы можете быть уверены, что все работы по управлению людьми будут правильно управляться системой.Только не забывайте, что свойство сохраняет значение, когда вы выполняете setSections :, так что вам нужно передать автоматически освобожденный объект здесь.

self.sections = [NSMutableArray array];

...

[self.sections addObject:section];

Также, чтобы избежать всехПроблема в том, чтобы сделать все объекты, которые должны жить только в этом методе, автоматически.Например:

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
NSString *responseString = [[[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding] autorelease];

NSDictionary *results = [responseString JSONValue];
NSMutableArray *jSections = [results objectForKey:@"Items"];
self.sections = [NSMutableArray array];

for (NSArray* jSection in jSections) {
    Section* section = [[[Section alloc] init] autorelease];
    section.Id = [jSection objectForKey:@"Id"];
    section.Description = [jSection objectForKey:@"Description"];
    section.Image = [jSection objectForKey:@"Image"];
    section.Parent = [jSection objectForKey:@"Parent"];
    section.ProductCount = [jSection objectForKey:@"ProductCount"];
    [self.sections addObject:section];
}

[delegate sectionsLoaded];

[self.view reloadData];

}

А также большинство объектов, которые вы пытаетесь освободить, уже автоматически освобождены: все параметры, передаваемые в ваш метод, не должны освобождаться вручную, проверьте, я думаю, JSONValue также следуетвозвращает автоматически освобожденный объект и все, что вы получаете, перечисляя или вызывая objectForKey:

...