2009-08-17 79 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

一个可能的解决方案是将某个结构的一个非特定初始化实例存储到某个位置,并与之进行比较。除了初始化内存之外,你仍然有这样的问题,你实际上不应该对未初始化的内存做任何事情。