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