objective-c - 在子类中覆盖初始化

在Objective-C中,是否需要重写子类的所有继承构造函数来添加自定义初始化逻辑?

例如,对于具有自定义初始化逻辑的 UIView 子类,以下内容是否正确?

@implementation CustomUIView

- (id)init {
    self = [super init];
    if (self) {
        [self initHelper];
    }
    return self;
}

- (id)initWithFrame:(CGRect)theFrame {
    self = [super initWithFrame:theFrame];
    if (self) {
        [self initHelper];
    }
    return self;
}

- (id)initWithCoder:(NSCoder *)decoder {
    self = [super initWithCoder:decoder];
    if (self) {
        [self initHelper];
    }
    return self;
}

- (void) initHelper {
    // Custom initialization
}

@end

最佳答案

每个 Cocoa Touch(和 Cocoa)类都有一个指定的初始化器;对于 UIView,如 in this documentation 所述,该方法是 initWithFrame:。在这种特殊情况下,您只需要覆盖 initWithFrame;所有其他调用最终将级联并命中此方法。

这超出了问题的范围,但如果你最终创建了一个带有额外参数的自定义初始化程序,你应该确保在分配 self 时为父类(super class)指定了指定的初始化程序,就像这样:

- (id)initWithFrame:(CGRect)theFrame puzzle:(Puzzle *)thePuzzle title:(NSString *)theTitle {
    self = [super initWithFrame:theFrame];
    if (self) {
        [self setPuzzle:thePuzzle];
        [self setTitle:theTitle];
        [self initHelper];
    }
    return self;
}

https://stackoverflow.com/questions/4359617/

相关文章:

objective-c - 调用 -retainCount 被认为是有害的

iphone - viewWillAppear,viewDidAppear 没有被调用,没有触发

iphone - 关于带有文本字段的 UIAlertView...

c++ - UInt8 和 uint8_t 有什么区别

objective-c - 使用 JSON (iOS) 的 Cocoa 错误 3840

ios - scaledValueForValue : called on a font that

ios - 在从 UIViewController 调用的非保留完成中引用 self 时,weakS

objective-c - 如何在 Objective-C 中命名常量?

objective-c - CAEmitterLayer 在触摸事件中随机发射不需要的粒子

ios - UIImagePickerController 相机 View 在 iOS 8 上奇怪地