在Objective-C中调用“super init”

时间:2014-02-16 16:06:59

标签: objective-c class retain autorelease

在阅读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吗?

谢谢!

3 个答案:

答案 0 :(得分:3)

直接来自Apple的official documentation

  

实施时要遵循几个关键规则   init ...方法,作为类的唯一初始化程序,或者,如果有的话   是多个初始化器,它的指定初始化器(描述于   “多个初始化器和指定的初始化器”):

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

  •   
  • 检查超类返回的对象。如果是nil,则初始化不能继续;返回接收者。

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

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

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

    •   
    • 问题导致初始化无法成功,在这种情况下返回nil。

    •   
  •   

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

答案 1 :(得分:1)

1

一般来说:打电话给超级。

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

请参阅:http://macdevelopertips.com/objective-c/objective-c-initializers.html

2

如果使用arc,则不必进行手动内存管理,因此setter将是一行。大多数时候自动合成它很好

答案 2 :(得分:-1)

我知道调用[super init]的原因是实际初始化属于超类的东西。当我写完答案时,我发现@gabrielePetronella给出了一个更好的答案。请检查出来。

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