我已经在<script>
var x = {"data":['A','B','C']};
for(v in x)
{
alert(v[0]);
}
</script>
中对指定和便利初始化器进行了大量阅读,并且我对它们的使用方式和原因有了很好的理解。我只有几个突出的问题,其中一个是真的。
假设您有一个直接从objective-c
继承的类,并为其创建指定的初始化程序。
我意识到你现在可以使用 NS_DESIGNATED_INITIALIZER 来标记你的指定初始值设定项,但是我想知道这是否意味着它是否强迫你在同一个类中分别通过调用指定的初始化程序来覆盖init?
其次,如果你不使用这个宏,那么在调用指定的初始值设定项时,NOT明确覆盖init的含义是什么呢?我意识到编译器不会知道哪个是指定的初始化程序,所以可能有什么不好的结果,并且当你为你的类创建一个新的指定的initalizer时,它是否也是优秀的做法?
编辑:我只是想进一步澄清这个问题。我已经看到好的编码器的例子没有添加一个不同的方法来覆盖init,尽管已经添加了他们自己制作的指定初始化器。 当我问你是否应该覆盖init时,除了创建你自己的特定指定初始化器之外,我的意思是当然应该调用它的超类的init方法。我见过一个好的程序员没有这样做,所以我想知道为什么你会这样做。
答案 0 :(得分:3)
您现在可以使用NS_DESIGNATED_INITIALIZER标记指定的初始值设定项,但我想知道这是否意味着它会强制您在同一个类中分别通过调用指定的初始化程序来覆盖init?
在self中调用任何初始化程序将绕过警告。当我尝试调用super.init方法时,我会收到以下警告。
便利初始化程序错过了一个自我&#39;打电话给另一个初始化器。
通过调用指定的初始值设定项,明确覆盖init的含义是什么?
这意味着你的对象可能缺少一些它需要运行的重要信息,或者应用程序假设对象总是有,如果它没有它,它可能会导致错误或崩溃应用程序。
以下是对其工作原理的一个很好的解释:
http://timekl.com/blog/2014/12/09/objective-cs-designated-secret/