9

我是 Objective-C 和 Cocoa 的新手。我读过 NSInteger 和 NSNumber 在处理简单整数时是首选,因为它们是原始数字类型的“平台安全”版本(在 NSNumber 的情况下,包装在一个对象中)。所以,我需要在我的班级中有一个计数器,当 NSTimer 触发时它会增加。在 Apple 论坛上,我发现一群人都向处于类似情况的人推荐他们应该在标头中声明一个 NSNumber 指针,使用 numberWithInt: 对其进行初始化,然后每次需要递增时,将其分配给一个新对象(类似于counter = [NSNumber numberWithInt:[counter intValue]+1];)。这对我来说似乎有点矫枉过正。如果我只需要一个 int 计数器(顺便说一句,我在它达到 15 后将它重置回 0,所以大小不是问题),我不能只使用一个 int 而不必分配一个我的计时器循环的每次迭代都有新对象?

如果是这样,我如何在整个班级中提供原始类型。我知道对于对象类型,我在我的界面中声明它并使用@property 和@synthesize ...当使用原语时,什么是等效的(如果存在的话)?

4

5 回答 5

15

使用 NSNumber 做一个简单的计数器确实看起来有点过头了。您可以将类成员声明为 NSInteger 并使用 ++ 或 += 简单地更新它们

例如:

@interface YourViewController : UIViewController  {
NSInteger counter;      
}

@property (nonatomic,assign) NSInteger counter;

@synthesize 只是:

@synthesize counter

并且可以通过以下方式增加:

self.counter += 1;

或者

counter ++;

后者将阻止任何观察者被告知,因此可能不是可取的。

于 2009-05-27T12:17:08.567 回答
9

NSNumber 是数字的对象表示。我在将数字存储在集合类中时使用它,因为它们只能保存对象指针。

所以在你的例子中,它需要一个计数器,它可能是矫枉过正的。

NSInteger 只是一个经过类型定义的整数,对于 32 位和 64 位程序是安全的,Apple 建议使用它来代替int. 它不是一个对象。这可能是您需要的计数器(实际上是 NSUInteger,它是一个unsigned int)可能会更好。

至于在整个班级中提供原语 - 好吧,如果您在标头中将其声明为 iVar,那么无论如何它在整个班级中都可用。@property并且@synthesize只是 Objective-C 2.0 将这些声明为可以在您的类之外以符合 KVC/KVO 的方式看到(并且可能更改)的属性的方式。原始类型可以用作属性,使用相同的@property语法@synthesize

于 2009-05-27T12:21:32.520 回答
4

我使用NSInteger(不是 int,更便于移植),NSNumber如果需要将其添加到集合中(例如NSMutableDictionary在退出应用程序时保存状态时),我将其包装到 a 中。

于 2009-05-27T12:23:21.300 回答
1

我同意您的直觉,将对象用于简单的计数器听起来有点矫枉过正,并且会添加不必要数量的消息调度调用来简单地增加计数器。对于不需要存储在集合中或作为对象操作的计数器,请坚持使用 C 标量类型。

要将标量声明为类的实例变量,只需在头文件中声明它:

@interface MyClass: NSObject{
  int counter;
}

@end
于 2009-05-27T12:24:53.480 回答
0

如果您确实需要增加 NSNumber(例如对于 NSManagedObject 属性),我发现这个类别有帮助:

@interface NSNumber (Incrementer)
- (NSNumber *)increment;
@end

@implementation NSNumber (Incrementer)
- (NSNumber *)increment {
    return [NSNumber numberWithInt:[self intValue]+1];
}
@end

因此您可以将增量语句简化为:

counter = [counter increment];
于 2010-08-16T12:58:08.877 回答