gpt4 book ai didi

ios - 为什么当 Objective-C 有冲突返回类型时会发生这种情况?

转载 作者:行者123 更新时间:2023-12-01 22:16:44 25 4
gpt4 key购买 nike

问题是:我想在iOS设备上显示像gif效果一样的序列图,并且我使用UIImageView动画功能,所以实现如下方法:

// Animation.m
// @files: diagrams' array
// @fileDir: file directory
// @imageview: Just UIImageView
//
- (void)showSeqDiagram:(NSArray*)files
fileDirect:(NSString*)fileDir
imageView:(UIImageView*)imageview
{
int cnt = [files count];
NSMutableArray * images = [NSMutableArray arrayWithCapacity:cnt];
for (id file in files)
{
NSString * imageName = [NSString stringWithFormat:@"%@/%@", fileDir, file];
UIImage * image = [UIImage imageNamed:imageName];

if(!image)
continue;
[images addObject:image];
}
imageview.animationImages = images;

imageview.animationDuration = 5;
imageview.animationRepeatCount = 1;
[imageview startAnimating];
}

到目前为止,一切都很顺利。我在头文件中声明返回类型时犯了一个错误,如下所示:

//Animation.h
- (UIImageView*)showSeqDiagram:(NSArray*)files
fileDirect:(NSString*)fileDir
imageView:(UIImageView*)imageview;

我在 - (void)loadView 中调用这个方法

- (void)loadview
{
......
[self showSeqDiagram:files fileDirect:fileDir imageView:imageview];
......
}

然后在iPhone5模拟器和设备上,iOS版本9.3上,在调用位置崩溃并抛出EXC_BAD_ACCESS(code=1, );

在iPhone6模拟器、iOS版本9.3上偶尔崩溃;

在 iPhone6/6plus 设备和 iPhone6plus 模拟器上从未崩溃,在 iOS 7-9 上测试。

我知道这是错误的,但想知道为什么会发生这种情况,有人可以解释一下吗?先谢谢了~

最佳答案

嗯,我的同事已经回答了,详细信息如下:

  • 首先2个背景:
  • arm-arch 将方法返回值存储在 %rax 寄存器中;
  • 并且对象在 ARC 模式下不会立即释放并且_obj_release_XXX 在 RunLoop 中具有最低优先级

所以showSeqDiagram不会返回任何值,因此%rax​​寄存器没有值,但autoReleasePool尝试在短时间内释放%rax中的“UIImageView”对象(优先级最低)。在这么短的时间内,如果其他RunLoop中的其他方法覆盖了%rax,那么它不会崩溃;否则,如果没有人重写%rax,就会发生崩溃。

这可以部分解释为什么随机崩溃。还有更好的答案吗?

关于ios - 为什么当 Objective-C 有冲突返回类型时会发生这种情况?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39239889/

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