代码之家  ›  专栏  ›  技术社区  ›  nevan king

如何检查结构是否已初始化?

  •  4
  • nevan king  · 技术社区  · 15 年前

    我正在使用一个Nsrange(结构)并按如下方式初始化它:

    @interface MyViewController : UIViewController
    {
        NSRange currentRange;
    }
    

    NSRANGE有一个位置和长度字段。

    如何检查结构是否已用值初始化?我试过:

    if (myRange.length == nil)
    

    但编译器抱怨将指针与整数进行比较。谢谢。

    4 回复  |  直到 15 年前
        1
  •  9
  •   user23743    15 年前

    nil 是指针,但是 length 是整数,因此出现编译器警告。你可以比较一下 长度 0 ,但这是一个合法的长度值, NSRange . 如果我需要一个“尚未初始化”的值 currentRange ,我选择将其设置为:

    { .location = NSNotFound, .length = 0 }
    

    在里面 -init . 当然,这是假设在操作过程中,范围永远不能假定该值。如果范围真的能扩大 任何 对于其域中的值,则不能将它们中的任何一个用作“尚未初始化”的占位符。

    您可以选择存储指向范围的指针,该范围在设置范围之前为空。另一种选择是使用状态模式来区分设置范围之前和之后的状态。另一种方法是设计类及其接口约定,使范围仅在设置之后才被使用。

        2
  •  0
  •   Jesús A. Álvarez    15 年前

    你不能。如果它没有初始化,它将有随机值,或者根据编译器的不同被初始化为零,因此没有安全的检查方法。

        3
  •  0
  •   peterb    15 年前

    基本上有两个选项:要么显式初始化结构(建议将位置初始化为nsnotfound是一个很好的方法),要么将其设置为指针。但接下来您将为此管理堆内存,这可能比您所期望的要多。

    从哲学上讲,在初始化之前进行任何类型的比较都是在自找麻烦。即使这是一个指针,我仍然(亲自)将它显式初始化为零。在myviewcontroller的-init方法期间,您不咬苹果有什么原因吗?

        4
  •  0
  •   Clay    15 年前

    一个可能的解决方案是将该结构的cannonic初始化实例存储到某个地方,并与之进行比较。您仍然存在这样一个问题,即除了初始化内存之外,您不应该对未初始化的内存执行任何操作。