2010-11-04 5 views
1

У меня есть NSMutableArray определено в моем классе AppDelegate:Почему моя переменная недоступна?

NSMutableArray *devices; 

я заполнить массив из одного класса в методе didFinishLaunchingWIthOptions:

Devices *devs = [[Devices alloc] init]; 
self.devices = [devs getDevices]; 

Метод getDevices разбирает строку JSON и создает объект устройства , добавив его в массив:

NSMutableArray *retDevices = [[NSMutableArray alloc] initWithCapacity:[jsonDevices count]]; 

for (NSDiectionary *s in jsonDevices) { 
    Device *newDevice = [[Device alloc] init]; 
    device.deviceName = [s objectForKey:@"name"]; 

    [retDevices addObject: newDevice]; 
} 

return retDevices; 

Затем я использую массив устройств класса AppDelegate для заполнения таблицы Посмотреть. Как видно в методе cellForRowAtIndexPath:

AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate]; 
Device *d = (Device *)[appDelegate.devices objectAtIndex:indexPath.row]; 

cell.label.text = d.deviceName; 

Когда TableView заполняется на начальном этапе, это работает. Но когда я просматриваю список, и cellForRowAtIndexPath выполняется снова, d.deviceName выдает ошибку, потому что она вышла за рамки.

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

Заранее спасибо.

+0

Вы пропускаете массив retDevices, который даже не объявлен должным образом (вы забыли *). Аналогичным образом во втором блоке кода вы обнаружите утечку объекта devs. –

+0

Вы также просачиваете каждый newDevice внутри массива retDevices. –

+0

Пропущенный * был надзором с моей стороны при копировании кода. У моего приложения действительно есть * в этой декларации. Должен ли newDevice быть выпущен в конце цикла? – bugfixr

ответ

4

Если это действительно проблема с управлением памятью, отвечая на эти вопросы должны привести вас к ответу:

  • ли deviceName объявлен как retain или copy имущества декларации Device интерфейса?
  • Is -deviceName синтезирован? Если нет, как это реализовано?
  • Является devices объявлен как свойство retain по объявлению интерфейса класса делегата приложения?
  • Is devices синтезирован? Если нет, как это реализовано?

Конечно, это может быть проблемой при управлении памятью. Это очень помогло бы, если бы вы предоставили фактический текст сообщения об ошибке и любую предоставленную обратную трассировку.

+0

deviceName был объявлен как @property (readwrite, assign, nonatomic) NSString * deviceName; Если я изменю его, чтобы сохранить, в какой момент мне нужно его выпустить? – bugfixr

+1

Когда его владелец умирает, т. Е. Объект «Устройство». Поместите '[deviceName release], deviceName = nil;' в '' '' 'устройства'' -dealloc'. –

+0

ok, добавление сохранения в объявлении устройств делегатов, похоже, исправило это. Может ли кто-нибудь помочь мне понять * почему *?Не сохраняя, является ли память «выпущена» сама по себе в какой-то момент (тип сборщика мусора?) Почему это работает для первой итерации, но не работает позже, когда прокручивается список? – bugfixr

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