objective-c - 调用父类(super class)的 init 方法后强制初始化父类(super class)的 ivar

标签 objective-c cocoa

我需要在父类(super class)中强制初始化 ivar,但如果没有初始化子类中的其他数据,通常无法初始化 ivar。我想到的两种解决方案是:

  1. 将 ivar 所需的生成 key 传递给父类(super class)的 init 方法
  2. 从子类的 init 方法调用第二个父类(super class)方法

这是示例(人为的、不起作用的)代码。 stringBasedOnSubclassKey ivar 应从子类的 key 方法初始化为 NSString。

@interface MySuperclass : NSObject
    @property (nonatomic, readonly) NSString *stringBasedOnSubclassKey;
@end

@interface MySubclass : MySuperclass
    @property (nonatomic, assign, readonly) int value;
@end

@implementation MySubclass

- (instancetype)init
{
    if (self = [super init]) {
        _value = 30;
    }
    return self;
}

- (NSString *)key
{
    return [NSString stringWithFormat:@"UniqueKey-%d", self.value];
}

所以问题是有没有办法使用“key”方法的返回值强制初始化 stringBasedOnSubclassKey ivar?我不相信我可以强制执行上面的解决方案 1 和 2。这些子类也可能是由其他外部开发人员创建的,因此关键方法可能比这更复杂。

更新:我正在处理该基类的现有子类,因此限制对现有子类的更改的解决方案是一个因素。

最佳答案

以强制初始化stringBasedOnSubclassKey的方式编写getter:

- (NSString *) stringBasedOnSubclassKey {
    if !(_stringBasedOnSubclassKey) {
        _stringBasedOnSubclassKey = // whatever;
    }
    return _stringBasedOnSubclassKey;
}

并编写父类(super class)key方法来抛出异常,从而强制客户端在子类中重写它。

关于objective-c - 调用父类(super class)的 init 方法后强制初始化父类(super class)的 ivar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16375508/

相关文章:

ios - 为什么奇异鸟匹配器在匹配时会引发异常?

Objective-C 创建一个带有字符串的文本文件

macos - 检测其他进程何时关闭 OSX

objective-c - copyWithZone 设置实例变量?

objective-c - iOS - heightForRowAtIndexPath 在滚动期间不触发

Java 到 Objective c

cocoa - 减慢或暂停 NSAnimationContext

cocoa - ARC 不兼容类型类型转换

cocoa - 将 NSArrayController 绑定(bind)到 NSDictionary allValues

ios - Storyboard ios 中具有不同页面 View 的 PageViewController