2010-10-09 3 views
0

У меня есть ViewController определяется следующим образом:Objective C - UITableView после вызова reloadData мои свойства объекта являются недействительными/ноль

@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, который должен затем представить данные в клетку однако его в этой точке, что секции теперь NIL снова.

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

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

ответ

1

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

sections = [NSMutableArray array]; 

должен стать

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

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

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

+0

Извините, что я отредактировал сообщение, чтобы включить реальную функцию, и я освобождаю переменную раздела, но это хорошо. Проблема по-прежнему остается в том, что после вызова reloadData разделы равны нулю. Это похоже на сбрасывание всего viewcontroller. – Chris

+0

Я обновил ответ, чтобы отразить новый код. Я надеюсь, что это поможет – Bitgamma

+0

Спасибо за ответ, но это не имеет значения. – Chris

0

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

self.sections = [NSMutableArray array]; 

...

[self.sections addObject:section]; 

Кроме того, чтобы избежать все проблемы пытаются сделать все объекты, которые должны жить только в этом методе autorelease. Как это:

- (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]; 

}

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

 Смежные вопросы

  • Нет связанных вопросов^_^