我在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会抛出一个错误,因为它已超出范围。
任何人都可以帮我理解为什么吗?我确定它与正在发布的项目有关......但是...... ??
提前致谢。
答案 0 :(得分:4)
如果内存管理确实存在问题,回答这些问题应该会引导您回答:
deviceName
接口声明是否retain
声明为copy
或Device
属性?-deviceName
合成了吗?如果没有,它是如何实施的?devices
声明为retain
属性?devices
合成了吗?如果没有,它是如何实施的?当然,它可能不是内存管理的问题。如果您要提供错误消息的实际文本和任何提供的回溯,这将有很大帮助。