为什么我的变量超出范围?

时间:2010-11-04 00:13:47

标签: objective-c

我在AppDelegate类中定义了一个NSMutableArray:

NSMutableArray *devices;

我在didFinishLaunchingWIthOptions方法的类中填充数组:

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

getDevices方法解析json字符串并创建一个Device对象,并将其添加到数组中:

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类的devices数组来填充tableView。如在cellForRowAtIndexPath方法中所见:

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

cell.label.text = d.deviceName;

最初填充tableview时,它可以正常工作。但是当我滚动列表并再次执行cellForRowAtIndexPath时,d.deviceName会抛出一个错误,因为它已超出范围。

任何人都可以帮我理解为什么吗?我确定它与正在发布的项目有关......但是...... ??

提前致谢。

1 个答案:

答案 0 :(得分:4)

如果内存管理确实存在问题,回答这些问题应该会引导您回答:

  • deviceName接口声明是否retain声明为copyDevice属性?
  • -deviceName合成了吗?如果没有,它是如何实施的?
  • 应用委托类的接口声明是否将devices声明为retain属性?
  • devices合成了吗?如果没有,它是如何实施的?

当然,它可能不是内存管理的问题。如果您要提供错误消息的实际文本和任何提供的回溯,这将有很大帮助。