2009-08-17 50 views
4

我使用NSRange(一個結構),並對其進行初始化這樣的:如何檢查結構是否已被初始化?

@interface MyViewController : UIViewController 
{ 
    NSRange currentRange; 
} 

NSRange具有位置和長度字段。

如何檢查結構是否已使用值進行初始化?我試過了:

if (myRange.length == nil) 

但編譯器抱怨比較指向一個整數的指針。謝謝。

回答

9
nil

是一個指針,但length是整數,因此編譯器警告。您可以將length0進行比較,但對於NSRange中的長度,這是合理的值。如果我需要有一個「尚未初始化」值currentRange,我會選擇將其設置爲:

{ .location = NSNotFound, .length = 0 } 
-init

。當然,這意味着範圍永遠不能在運營過程中承擔這個價值。如果範圍真的可以採用的任何其中的值,那麼您不能將它們中的任何一個用作「尚未初始化」的佔位符。

您可以選擇存儲一個指向該範圍的指針,直到範圍被設置。另一種選擇是使用狀態模式區分範圍設置前後的狀態。另一個是設計類和它的接口合約,以便在設置後才能使用範圍。

0

你不行。如果它沒有被初始化,它將會有隨機值,或者被初始化爲零,這取決於編譯器,所以沒有安全的方法來檢查。

+1

根據http://developer.apple.com/documentation/Cocoa/Conceptual/ObjectiveC/Articles/ocObjectsClasses.html#//apple_ref/doc/uid/TP30001163-CH11-TPXREF116,它必須被初始化爲0 – newacct 2009-08-17 09:57:28

+0

所有實例變量均歸零。但是,無論如何,由於{0,0}是一個有效的NSRange,所以您無法檢查範圍是否已初始化。 – 2009-08-17 10:16:22

+0

爲什麼這是低調?檢查它是否被初始化的唯一方法是添加一些額外的結構來跟蹤它。 – 2009-08-17 12:34:08

0

您有兩種基本選擇:要麼顯式初始化結構(建議並初始化位置NSNotFound是一個很好的),或者使它成爲一個指針。但是你會爲此管理堆內存,這可能比你討價還價的多。

從哲學上講,在初始化之前做任何比較都是爲了求助。即使這是一個指針,我仍然(親自)將它初始化爲零。在MyViewController的-init方法中,有沒有一些原因讓你沒有在蘋果上咬一口?

0

一個可能的解決方案是將某個結構的一個非特定初始化實例存儲到某個位置,並與之進行比較。除了初始化內存之外,你仍然有這樣的問題,你實際上不應該對未初始化的內存做任何事情。