在Objective-C中调用“超级初始化” [重复]

Posted

技术标签:

【中文标题】在Objective-C中调用“超级初始化” [重复]【英文标题】:Calling "super init" in Objective-C [duplicate] 【发布时间】:2014-02-16 16:06:58 【问题描述】:

在阅读有关 Objective-C 中的类时,我发现在某些情况下,人们建议在实现 init 方法时这样做:

- (id) init 

    if ( self = [super init] )  

        ...
    

    return self; 

虽然其他人没有提到这一点。哪一个是正确的?

此外,在大多数情况下定义 setter 时,它们只是包含在一个赋值中,但有时它们显示为:

- (void) setCaption: (NSString*)input 

  [caption autorelease];
  [input retain];
  caption = input;

再一次,哪一个是最好的方法? ARC对此有影响吗?如果我使用ARC,我不需要像上面那样使用autorelease吗?

谢谢!

【问题讨论】:

有了 ARC,你不必关心内存管理,所有方法,如保留、释放、自动释放和释放,都是被禁止的。 【参考方案1】:

直接来自 Apple 的 official documentation:

在实施项目时需要遵循几条关键规则 init... 用作类的唯一初始化程序的方法,或者,如果有 是多个初始化器,其指定的初始化器(在 “多重初始化器和指定初始化器”):

始终首先调用超类(超)初始化程序。

检查超类返回的对象。如果为 nil,则无法进行初始化;返回 nil 给接收者。

初始化作为对象引用的实例变量时,根据需要保留或复制对象(在内存管理的 代码)。

将实例变量设置为有效初始值后,返回self,除非:

必须返回一个替代对象,在这种情况下,首先释放新分配的对象(在内存管理代码中)。

一个问题阻止了初始化成功,在这种情况下返回 nil。


关于第二个问题,您通常不必手动实现访问器方法,但如果您必须或想要,这里有一个有用的参考:Explicit getters/setters for @properties (MRC)

【讨论】:

我想提一下,绝对应该阅读 objc 初始化程序 - 文档当然是正确的 - 但恕我直言有点简短【参考方案2】:

1

一般情况下:调用 super。

但要注意专用的初始化器,不要盲目地覆盖东西

见:http://macdevelopertips.com/objective-c/objective-c-initializers.html

2

如果您使用 arc,则不必进行手动内存管理,因此 setter 将是一行。大部分时候自动合成就可以了

【讨论】:

inits 上的链接是必须阅读的 ;)【参考方案3】:

我知道调用[super init] 的原因是为了实际初始化属于超类的东西。我在写答案时找到了@gabrielePetronella 给出的更好的答案。请检查一下。

而且,如果使用 ARC,则不会使用[release][autorelease] 等一组内存管理方法。即使您尝试使用这些方法,Xcode 也会向您发送编译错误。

【讨论】:

你没有链接答案,也没有提供任何我担心的新内容。

以上是关于在Objective-C中调用“超级初始化” [重复]的主要内容,如果未能解决你的问题,请参考以下文章

转换为 Swift 3 重命名了我自己的 Objective-C 方法

如何在c++中,调用objective-c

objective-c 我想点击一下按钮,使按钮能出现一个动画移动效果,请高手指教!

在制作反应组件 es6 语法时,为啥用道具超级初始化? [复制]

objective-c 中如何在一个函数中调用自己类中的另外一个函数

如何在 Swift 中调用 Objective-C 类别方法