在objective-c中使用int数据类型

时间:2010-11-05 10:47:22

标签: objective-c ios

首先,我对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对象。我访问该字符串并将其分配给我的单元格中的标签,它从来没有给我带来任何问题。

先谢谢你一起来看看。

2 个答案:

答案 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;以使最大值足够高。