在 Objective-C 中使用 int 数据类型
Posted
技术标签:
【中文标题】在 Objective-C 中使用 int 数据类型【英文标题】:Using int datatype in objective-c 【发布时间】:2010-11-05 10:47:21 【问题描述】:首先,我对 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;
我创建了一个包含许多设备对象的 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 对象。 【参考方案1】:这一行中的nodeLevel 属性返回什么类型:“newDevice.nodeLevel = d.nodeLevel;”? Device 中的 nodeLevel 属性是一个 int,因此您需要确保 d.nodeLevel 返回一个 int,而不是 NSNumber 对象。
如果 d.nodeLevel 返回一个 NSNumber,这就解释了为什么调用它的 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];
【讨论】:
谢谢,这就是问题所在。在我的作业中,我实际上将 nodeLevel 设置为 NSInteger 指针的 int 值。【参考方案2】:[d nodeLevel]
返回一个整数,一个原始类型,而不是一个 Objective-C 对象。因此,您不能在其上调用-intValue
,这就是您获得 EXC_BAD_ACCESS 的原因。
此外,您的滑块被最大化的原因是您没有将其最大值设置为 2.0。因为它默认为 1.0,所以当您将其设置为 1.0 或更高的任何值时,它将显示为最大化(在您的情况下,1 和 2 看起来相同)。在某些时候,您需要调用cell.sliderLevel.maximumValue = 2.0;
以使最大值足够高。
【讨论】:
感谢您的回答...实际上我确实设置了最大值,我只是没有在我提供的代码 sn-ps 中向您展示。我为此道歉。最后,为什么 intValue 在我的 tableView 的初始显示中起作用?只有在上下滚动我的视图一段时间后才会失败。 我不确定,因为并非您的所有代码都已发布(而且我也不是真正的 ios 开发人员),但我假设您在被引用的同时自动释放了对象,这会导致问题。我会假设,但我不确定。以上是关于在 Objective-C 中使用 int 数据类型的主要内容,如果未能解决你的问题,请参考以下文章
Objective-C中,类方法的getter和setter可以用点运算符吗?
Objective-C:如何从 .NET 的 BitConverter 类中读取数据