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

时间:2016-08-31 02:35:12

标签: ios objective-c uiimageview crash return

问题出在这里:我想在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模拟器和设备上抛出EXC_BAD_ACCESS(代码= 1,),iOS verison9.3;

偶尔会在iOS6版本的iPhone6模拟器上崩溃;

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

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

1 个答案:

答案 0 :(得分:0)

好吧,我的同事回答了,详情如下:

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

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

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