首先,我对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];
}
我的设备数组存储在主app代理中,我已经分配了一个属性来保存它:
@property (nonatomic, retain) NSMutableArray *devices;
现在我的问题显现在这里。我在另一个控制器类中使用tableView来访问我的app委托,从其数组中提取设备然后使用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对象。我访问该字符串并将其分配给我的单元格中的标签,它从来没有给我带来任何问题。
先谢谢你一起来看看。
答案 0 :(得分:2)
此行中的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];
答案 1 :(得分:1)
[d nodeLevel]
返回一个整数,一个基本类型,而不是一个Objective-C对象。因此,您无法在其上调用-intValue
,这就是您获得EXC_BAD_ACCESS的原因。
此外,滑块最大化的原因是您没有将其最大值设置为2.0。因为它默认为1.0,当你将它设置为1.0或更高的任何值时,它将显示为最大值(在你的情况下,1和2看起来都相同)。在某些时候,您需要调用cell.sliderLevel.maximumValue = 2.0;
以使最大值足够高。