2009-05-27 66 views
9

我是Objective-C和Cocoa的新手。我讀過NSInteger和NSNumber在處理簡單整數時首選,因爲它們是基本數字類型的「平臺安全」版本(在NSNumber的情況下,封裝在一個對象中)。所以,我需要一個在我的班級有一個計數器,當NSTimer發生火災時,這個計數器會增加。在蘋果論壇上,我發現一羣人都向類似情況的人推薦,他們應該在頭文件中聲明一個NSNumber指針,用numberWithInt:來初始化它,然後每次需要增加它時,都將它分配給一個新的對象(如counter = [NSNumber numberWithInt:[counter intValue]+1];)。這看起來對我來說太過分了。如果我需要的只是一個int計數器(並且順便說一句,我將它重置爲0,因爲它的大小不是問題),我不能使用int而不用分配一個int每次迭代我的計時器循環的新對象?NSNumber是否針對實例級計數器矯枉過正?

如果是這樣,我該如何在我的課程中創建一個基本類型。我知道用對象類型,我在我的界面中聲明它,並使用@property和@synthesize ...在處理基元時,等價物(如果存在的話)是什麼?

+0

第二個問題:它是一樣的,只需使用@property和@synthesize。 – 2009-05-27 12:15:05

回答

15

對一個簡單的計數器使用NSNumber看起來有點過分殺死。可以聲明類的成員如NSInteger的和簡單地更新它們使用++或+ =

例如:

@interface YourViewController : UIViewController { 
NSInteger counter;  
} 

@property (nonatomic,assign) NSInteger counter; 

的@synthesize只是:

@synthesize counter 

和可以通過遞增:

self.counter += 1; 

counter ++; 

以後將阻止任何觀察員被告知,因此可能不是優選的。

+0

我不知道+ =在屬性上工作......感謝@gs – 2009-05-28 08:09:10

9

NSNumber是一個數字的對象表示形式。在將數字存儲在集合類中時我使用它,因爲它們只能存放對象指針。

所以在你的例子中,需要一個計數器,它可能是矯枉過正。

NSInteger是一個簡單的整數,用於32位和64位程序的安全類型,Apple推薦使用它來代替int。這不是一個對象。這可能是你需要一個計數器(實際上NSUInteger,這是一個unsigned int)可能會更好。

至於在整個班級中製作原語 - 嗯,如果你在頭文件中聲明它是一個iVar,它在整個班級都可用。 @property@synthesize只是Objective-C 2.0的一些聲明這些屬性的方法,這些屬性可以按照KVC/KVO兼容的方式在您的課堂之外看到(也許已更改)。原語類型可以用作使用相同的@property@synthesize語法的屬性。

4

我用NSInteger(不是整數,更便攜),並將其包裝成一個NSNumber如果我需要(節約退出應用程序的狀態時,如NSMutableDictionary)將其添加到集合。

1

我同意你的直覺,使用一個簡單的計數器的對象聽起來像矯枉過正,並會增加不必要的數量的消息調度調用,只需增加一個計數器。對於不需要存儲在集合中或作爲對象操作的計數器,請使用C標量類型。

要聲明一個標爲您的類的實例變量,只是聲明它在你的頭文件:

@interface MyClass: NSObject{ 
    int counter; 
} 

@end 
0

如果需要增加一個NSNumber(如用於NSManagedObject屬性)我發現這一類幫助:

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

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

這樣可以簡化增量語句:

counter = [counter increment]; 
相關問題