Jas*_*ien 163 null objective-c init
我有一个关于在Objective-C中编写init方法的一般问题.
我看到它到处都是(Apple的代码,书籍,开源代码等)init方法应该在继续初始化之前检查self = [super init]是否为nil.
init方法的默认Apple模板是:
- (id) init
{
self = [super init];
if (self != nil)
{
// your code here
}
return self;
}
Run Code Online (Sandbox Code Playgroud)
为什么?
我的意思是什么时候初始会返回零?如果我在NSObject上调用init并且没有回来,那么一定要搞砸了,对吗?在那种情况下,你甚至可以不写一个程序......
类'init方法可能返回nil真的很常见吗?如果是这样,在什么情况下,为什么?
iKe*_*dac 52
例如:
[[NSData alloc] initWithContentsOfFile:@"this/path/doesn't/exist/"];
[[NSImage alloc] initWithContentsOfFile:@"unsupportedFormat.sjt"];
[NSImage imageNamed:@"AnImageThatIsntInTheImageCache"];
Run Code Online (Sandbox Code Playgroud)
... 等等.(注意:如果文件不存在,NSData可能会抛出异常).在发生问题时,有很多区域返回nil是预期的行为,并且由于这一点,为了一致性,标准做法几乎一直检查nil.
bbu*_*bum 50
这个特殊的习语是标准的,因为它适用于所有情况.
虽然不常见,但有些情况会......
[super init];
Run Code Online (Sandbox Code Playgroud)
...返回一个不同的实例,因此需要赋值给self.
并且会出现返回nil的情况,因此需要进行nil检查,以便您的代码不会尝试初始化不再存在的实例变量槽.
最重要的是它是使用的文档正确的模式,如果你不使用它,你做错了.
Gin*_*ino 26
我认为,在大多数课程中,如果[super init]的返回值为nil并按照标准实践的建议进行检查,然后如果为nil则提前返回,基本上你的应用程序仍无法正常工作.如果你想想看,即使是,如果(自我!=无)检查是存在的,为你的类的正确操作,你实际上是99.99%的时间都需要自我是非零.现在,假设,无论出于何种原因,[super init] 确实返回nil,基本上你对nil的检查基本上是把你的责任推到了你的类的调用者,无论如何它可能会失败,因为它自然会假设调用是成功的.
基本上,我所得到的是99.99%的时间,if(self!= nil)并没有为你提供更强大的东西,因为你只是把责任推卸给你的调用者.要真正能够强有力地处理这个问题,您实际上需要在整个调用层次结构中进行检查.即便如此,它唯一能给你买的是你的应用程序会更加干净/健壮地失败.但它仍然会失败.
如果一个库类任意决定由于[超级初始化]而返回nil,那么你几乎都会被删除,这更多地表明库类的编写者犯了实现错误.
当应用程序在更有限的内存中运行时,我认为这更像是一种遗留的编码建议.
但对于C级代码,我通常仍然会检查malloc()的返回值是否对NULL指针.然而,对于Objective-C,直到我找到相反的证据,我想我通常会跳过if(self!= nil)检查.为什么会出现差异?
因为,在C和malloc级别,在某些情况下,您实际上可以部分恢复.虽然我认为在Objective-C中,在99.99%的情况下,如果[super init]确实返回nil,那么即使你试图处理它,你也基本上都是f***ed.您可能只是让应用程序崩溃并处理善后事宜.
这是上述评论的总结.
假设超类返回nil.会发生什么事?
你的代码会在你的init方法中间崩溃.(除非init没有意义)
你的代码是probalby稍后会崩溃,因为你的实例是nil,你期望的东西不同.或者你的程序会出现意外行为而不会崩溃.噢亲爱的!你想要这个吗?我不知道...
您的代码文档(!)应该明确说明:"return ...或nil",其余的代码需要准备好处理它.现在它是有道理的.
通常,如果您的类直接来自NSObject,您将不需要.然而,这是一个习惯进入的好习惯,好像你的类派生自其他类,它们的初始化器可能会返回nil,如果是这样,你的初始化器就可以捕获它并且行为正确.
是的,为了记录,我遵循最佳实践并将其写在我的所有课程上,甚至是那些直接来自的课程NSObject.
| 归档时间: |
|
| 查看次数: |
39103 次 |
| 最近记录: |