NSNumber对实例级计数器是否过度杀伤?

时间:2009-05-27 12:06:42

标签: iphone objective-c cocoa nsnumber nsinteger

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

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

5 个答案:

答案 0 :(得分:15)

将NSNumber用于一个简单的计数器确实看起来有点过度杀戮。您可以将类成员声明为NSInteger,只需使用++或+ =

更新它们

例如:

@interface YourViewController : UIViewController  {
NSInteger counter;      
}

@property (nonatomic,assign) NSInteger counter;

@synthesize只是:

@synthesize counter

可以通过以下方式递增:

self.counter += 1;

counter ++;

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

答案 1 :(得分:9)

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

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

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

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

答案 2 :(得分:4)

我使用NSInteger(不是int,为了更加可移植),如果我需要将它添加到集合(例如NSNumber保存时将其包装到NSMutableDictionary中退出申请的国家。)

答案 3 :(得分:1)

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

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

@interface MyClass: NSObject{
  int counter;
}

@end

答案 4 :(得分:0)

如果您需要增加NSNumber(例如NSManagedObject属性),我发现此类别有帮助:

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

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

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

counter = [counter increment];