我正在进行的项目是SWIFT和OBJECT-C的混合体.以下是其中的一小段:

// ViewController.m
@interface ViewController ()

@property (nonatomic, strong) MyModel *model;

@end

@implementation ViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.model = [[MyModel alloc] initWithIntValue:10];
}

// MyModel.swift
fileprivate class SomeProperty {
    init() {
        print("SomeProperty init")
    }
}

class MyModel: BaseModel {
    private let property = SomeProperty()
}

// BaseModel.h
@interface BaseModel : NSObject

- (instancetype)initWithIntValue:(int)intValue;
- (instancetype)initWithIntValue:(int)intValue doubleValue:(double)doubleValue;

@end

// BaseModel.m
@implementation BaseModel

- (instancetype)initWithIntValue:(int)intValue doubleValue:(double)doubleValue {
    if (self = [super init]) {
        
    }
    return self;
}

- (instancetype)initWithIntValue:(int)intValue {
    return [self initWithIntValue:intValue doubleValue:0];
}

@end

有趣的是,我发现当初始化MyModel个实例时,SomeProperty init将打印两次,这意味着创建了两个SomeProperty实例.更糟糕的是,调试内存图显示存在SomeProperty对象内存泄漏.那么,为什么会出现这种情况,我如何才能修复它呢?

推荐答案

像这样重写BaseModel.h:

- (instancetype)initWithIntValue:(int)intValue;
- (instancetype)initWithIntValue:(int)intValue doubleValue:(double)doubleValue NS_DESIGNATED_INITIALIZER;

请注意第二个初始值设定项末尾的NS_DESIGNATED_INITIALIZER标记.(您可能必须滚动我的代码才能看到它.)

除了它在Objective-C中的作用(作为宏)之外,这个标记告诉SWIFT,这两个初始化器都不是指定的初始化器;相反,SWIFT得出结论,第一个是一个方便的初始化器.这是正确的;它调用另一个初始化器,也就是--在本例中--指定的初始化器.

如果没有这NS_DESIGNATED_INITIALIZER个加价,SWIFT会错误地解释这种情况,因为SWIFT初始化器和Objective-C初始化器之间的关系(已经相当复杂).它认为both个初始化器被指定为初始化器,而你从SWIFT那里得到了这个奇怪的双重初始化.

Ios相关问答推荐

在带有可编码的SWIFT5中,可以轻松处理以美元符号开头的JSON密钥,例如$DATE";

如何创建装饰视图?

iOS应用启动时崩溃问题解决方法-NO_CRASH_STACK-DYLD 4个符号丢失

当 Swift 枚举具有 any existential 作为其关联值之一时,我如何使它符合 `Equatable`?

@MainActor 类的扩展是主要演员吗?

如何在 SwiftUI 中对表格行使用 Transferable

在标签中显示多个计数器但在同一屏幕(Swift,IOS)

叠加视图不在堆栈中维护自身 - SwiftUI

在使用 Github Actions 时,我面临权限被拒绝错误

无法结合 UIImageView 旋转动画和 tableView 部分重新加载

如何从 scendelegate 打开我的标签栏控制器

核心数据 - 无法在路径加载优化模型

在 iOS 上存储身份验证令牌 - NSUserDefaults 与 keys 串?

如何从 UIPickerView 获取选定的值

从 UIScrollview 中删除内容和框架布局指南

快速从 NSTimeInterval 转换为小时、分钟、秒、毫秒

由于 GoogleSignIn、AdMob 提交应用程序时 iOS 10 GM 发布错误应用程序try 在没有使用说明的情况下访问隐私敏感数据

UIView 中的 safeAreaInsets 在 iPhone X 上为 0

zoom UIButton 动画 - Swift

如何创建 Select 器数组