在阅读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
吗?
谢谢!
答案 0 :(得分:3)
直接来自Apple的official documentation:
实施时要遵循几个关键规则 init ...方法,作为类的唯一初始化程序,或者,如果有的话 是多个初始化器,它的指定初始化器(描述于 “多个初始化器和指定的初始化器”):
始终首先调用超类(超级)初始化程序。
检查超类返回的对象。如果是nil,则初始化不能继续;返回接收者。
初始化作为对象引用的实例变量时,根据需要保留或复制对象(在内存管理中) 码)。
将实例变量设置为有效的初始值后,返回self,除非:
必须返回一个替换对象,在这种情况下首先释放新分配的对象(在内存管理代码中)。
问题导致初始化无法成功,在这种情况下返回nil。
关于第二个问题,您通常不需要手动实现访问者方法,但是如果您必须或想要,这里有一个有用的参考:Explicit getters/setters for @properties (MRC)
答案 1 :(得分:1)
一般来说:打电话给超级。
但要注意专用的初始化,不要盲目覆盖东西
请参阅:http://macdevelopertips.com/objective-c/objective-c-initializers.html
如果使用arc,则不必进行手动内存管理,因此setter将是一行。大多数时候自动合成它很好
答案 2 :(得分:-1)
我知道调用[super init]
的原因是实际初始化属于超类的东西。当我写完答案时,我发现@gabrielePetronella给出了一个更好的答案。请检查出来。
并且,如果您使用ARC,则不要使用一组内存管理方法,例如[release]
,[autorelease]
。即使您尝试使用这些方法,Xcode也会向您发送编译错误。