首先,我对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];

10-07 20:56