首先,我对Objective-C和内存管理,指针等非常陌生。毫无疑问,我的问题就在于我所缺少的简单点。
我有一个包含整数属性的类:
// Device.H file
@interface Device : NSObject {
@private int nodeLevel;
}
@property (readwrite, assign, nonatomic) int nodeLevel;
// Device.m file
@implementation Device
@synthesize nodeLevel;
- (id)init {
self.nodeLevel = 0;
return self;
}
我创建了一个由许多Device对象组成的NSMutableArray,并分配了节点ID:
-(NSMutableArray *)getDevices {
...
NSMutableArray *devices = [[NSMutableArray alloc] initWithCapacity:[rDevices count]];
for (NSDictionary *d in rDevices) {
Device *newDevice = [[Device alloc] init] autorelease];
newDevice.nodeLevel = d.nodeLevel;
[devices addObject: newDevice];
}
return [devices autorelease];
}
我的设备数组存储在主应用程序委托中,在其中我分配了一个属性来保存它:
@property (nonatomic, retain) NSMutableArray *devices;
现在,这就是我的问题所在。我在另一个控制器类中使用tableView访问我的应用程序委托,从其数组中拉出设备,然后使用int设置值,但是发生了“奇怪”的事情:
编辑:滑块的最小值/最大值在代码的另一部分分别设置为0和100。
// In method cellForRowAtIndex
AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
Device *d = (Device *)[[appDelegate.devices objectAtIndex:indexPath.row]];
// cell is a custom cell with a UISlider object
cell.sliderLevel.value = [d nodeLevel];
当我为设备的nodeLevel赋值时,即使nodeLevel仅等于1或2,滑块也始终处于最大状态。
如果我改为这样做,则滑块将位于正确的位置,但是在通过tableView上下滚动时,最终会得到“EXC_BAD_ACCESS”信号:
// cell is a custom cell with a UISlider object
cell.sliderLevel.value = [[d nodeLevel] intValue];
我怀疑我必须首先将值分配给内存位置吗?在第二种情况下,它可以工作,但是我认为我的BAD_ACCESS是nodeLevel变为“已释放”的结果吗?最后一点,我还有一个与Device类关联的NSString对象。我访问该字符串并将其分配给我的单元格中的标签,它永远不会给我带来问题。
在此先感谢您的浏览。
最佳答案
此行的nodeLevel属性返回什么类型:“newDevice.nodeLevel = d.nodeLevel;”? Device中的nodeLevel属性是一个int,因此您需要确保d.nodeLevel返回一个int,而不是NSNumber对象。
如果d.nodeLevel返回一个NSNumber,这将解释为什么在其上调用intValue会得到一个合理的值,而如果不对其调用intValue则会得到一个巨大的数字(该巨大的值将是NSNumber的指针值目的)。它还可以解释为什么以后会出现EXC_BAD_ACCESS崩溃的原因,因为未保留NSNumber对象。
您可能应该只更改此行:
newDevice.nodeLevel = d.nodeLevel;
至
newDevice.nodeLevel = [d.nodeLevel intValue];
并且以后不要再调用intValue,因此您可以更改以下内容:
cell.sliderLevel.value = [[d nodeLevel] intValue];
对此:
cell.sliderLevel.value = [d nodeLevel];