通过适当的数据类型优化内存使用

时间:2010-06-26 18:20:04

标签: iphone objective-c

所有

我已经做了10年的Java开发人员......在管理数字数据方面,我大部分都坚持使用int并在需要一些小数时使用double精确。原因是我们几乎有很大的堆空间可以使用,而且在大多数情况下耗费它很难......

我正在开始iPhone开发(我确实有一些C编程知识),我想知道我是否应该开始考虑使用适当的数据类型,因为设备本身的资源比典型的JavaEE应用程序少...... < / p>

例如,我有一个带有一些数字属性的对象(我们称这个属性为'state')。此属性只有-10到10之间的值。最初,我使用int定义了此属性,但现在我决定使用char。原因是我不需要那么多位来表示从-10到10的值...所以char是我需要的最小值。不幸的是,当有人看到char他们可能会想到角色,但我将其视为一个数字。我担心如果我坚持使用char ......

,我可能会引起一些混乱

所以给出了这段代码片段:

-(void)doSomething:(char)value {
    state = value;
}

然后调用它,例如:

[myObject doSomething:1];

我的问题是,我是否应该担心以这种方式优化数据类型?我是否需要开始检查溢出和抛出错误?或者这是一个非常好的编程?

谢谢!

编辑:我想我不应该在我的问题中使用名称state。我在这里没有特别的枚举,因为我对此值执行计算并根据需要更新state。它碰巧有一个固定的范围。

3 个答案:

答案 0 :(得分:3)

虽然这是完全可以接受的(通常我是这样做的),除非一行中有多个字符,对齐问题会强制下一个变量浪费1-3个字节,否则可能会被用于由int免费。我鼓励你研究调整,它相当简单,但有点冗长,以解释+后果。无论如何,为了避免混淆(虽然我怀疑会有很多,但基本上对每个人都有)你可能想要使用int8_t或者对于已签名的char进行typedef-ed。

编辑:我以前忘记的事情:MacOS上的malloc实现(也是iOS的基础)只返回16字节或更长的内存块,向上舍入。所以如果你是对象,比如说15个字节,你也浪费了一个字节,如果需要17个字节,你就浪费了15个。

答案 1 :(得分:1)

在这种情况下,我通常使用包含所有有效值的typedef枚举:

typdef enum {
    kMyStateOne,
    kMyStateTwo
} MyStates;

并编写如下方法:

-(void)doSomething:(MyStates)value {
    state = value;
}

所以您的代码用户知道使用:

[myObject doSomething:kStateOne];

这样你就会让编译器抱怨,如果他们传递了其他任何东西。

答案 2 :(得分:1)

除非您要创建此数字属性的大量副本,否则即使在iPhone上,空间也不是问题。更重要的是学习内存管理和基础数据类型(NSString,NSArray,NSNumber等)