gpt4 book ai didi

ios - 通过alloc方法初始化单例和普通对象有什么区别?

转载 作者:行者123 更新时间:2023-11-29 04:18:24 25 4
gpt4 key购买 nike

我正在测试 UITableView :(在 ARC 下)代码如下,

- (void)viewDidLoad
{
[super viewDidLoad];
UnitTest *unitTest = [[UnitTest alloc] init];

UITableView *tableView = [[UITableView alloc] initWithFrame:self.view.bounds style:UITableViewStylePlain];
tableView.delegate = unitTest;
tableView.dataSource = unitTest;

[self.view addSubview:tableView];

}

我已经在对象单元测试中实现了 tableView 委托(delegate)。当我运行我的项目时,它出现错误:

libobjc.A.dylib`objc_msgSend:
0x30f13f68: teq.w r0, #0
0x30f13f6c: beq 0x30f13faa ; objc_msgSend + 66
0x30f13f6e: push.w {r3, r4}
0x30f13f72: ldr r4, [r0] // Thread 1: BAD_EXE_ACCESS ....
0x30f13f74: lsr.w r9, r1, #2
0x30f13f78: ldr r3, [r4, #8]
0x30f13f7a: add.w r3, r3, #8
0x30f13f7e: ldr r12, [r3, #-8]

控制台中没有任何内容。

当我改变线路时

UnitTest *unitTest = [[UnitTest alloc] init];

UnitTest *unitTest = [UnitTest sharedUnitTest]; // i have implement this singleton

一切正常!!为什么

最佳答案

您在 ARC,这在这里意味着一些事情。基本上,您的 unitTest 迟早会被释放,因为您不保留对它的任何引用。但它仍然是 tableView 的委托(delegate)和数据源。因此,一段时间后(为了简化),tableView 将尝试调用其委托(delegate),但 unitTest 将被释放。

因此,这里最简单的解决方案是为 unitTest 创建一个属性:@property (nonatomic, Strong) UnitTest *unitTest; 在你的头文件中,在你的 .m 中综合它

然后,只需使用:

self.unitTest = [[UnitTest alloc] init];

它应该可以解决所有问题。为此,您可能不需要单例。

PS:单例修复这个问题的原因是单例会“永远存在”(只要应用程序启动)。由于它永远不会被释放,因此当 TableView 尝试调用其委托(delegate)/数据源时不会出现问题。

关于ios - 通过alloc方法初始化单例和普通对象有什么区别?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13344000/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com