在 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 类中读取数据

在 Objective-C 中维护代表不变量

如何在objective-c中将字节值转换为int

在Objective-C中使用精确的int字典值过滤字典的NSMutableArray

在不使用自引用的情况下设置 Objective-C 类属性