gpt4 book ai didi

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

转载 作者:塔克拉玛干 更新时间:2023-11-02 10:19:39 25 4
gpt4 key购买 nike

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

}

我的设备数组存储在主应用程序委托(delegate)中,我在其中分配了一个属性来保存它:

@property (nonatomic, retain) NSMutableArray *devices;

这就是我的问题所在。我在另一个 Controller 类中使用 tableView 来访问我的应用程序委托(delegate),从其数组中拉出一个设备,然后使用 int 设置值,但是发生了“奇怪”的事情:

编辑: slider 的最小值/最大值在代码的另一部分分别设置为 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 赋值时, slider 总是最大化,即使 nodeLevel 仅等于 1 或 2。

如果我改为这样做,则 slider 位于正确的位置,但在我的 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];

关于objective-c - 在 objective-c 中使用 int 数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4105165/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com