2016-08-31 26 views
1

這裏的問題是:我想顯示如GIF效果iOS設備上測序圖,我用的UIImageView動畫功能,所以在下面實現的方法:爲什麼在objective-c發生衝突返回類型時發生這種情況?

// 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; 

,我調用這個方法 - (空)的loadView

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

然後在調用位置崩潰,在iPhone5模擬器和設備上,iOS版verison9.3上拋出EXC_BAD_ACCESS(code = 1,);

偶爾墜毀iPhone6模擬器,iOS的version9.3;

從未墜毀iPhone6/6plus設備和iPhone6plus模擬器,在iOS 7-9測試了。

我知道這是錯的,但想知道爲什麼這個happend,可能有人給出一個解釋嗎?在此先感謝〜

+0

你在哪裏拍攝imageView,是在故事板/ Xib還是編程? – Janmenjaya

+0

修改返回類型,以便在.h和.m中使用相同的方法。嘗試設置斷點以找出該方法(行)上的問題究竟在哪裏,或者是因爲方法聲明與其實現不匹配。 – Larme

+0

你可以嘗試在* .h和* .m中修改不同的返回值,編譯器只會發出警告,而且它也可以在其他文件中調用,並且它們確實匹配。嘗試一下! –

回答

0

恩,我的我的同事有答案,下面是詳細信息:

  • 首先2背景:
  • 臂弓存儲方法的返回值%RAX寄存器中;
  • 並且對象不會立即在ARC模式下釋放,並且 _obj_release_XXX在RunLoop中具有最低優先級;

所以showSeqDiagram不會返回任何值,那麼%RAX寄存器有沒有價值,但autoReleasePool儘量短的時間後,在%RAX發佈「UIImageView的」 OBJ(優先級最低)。在如此短的時間內,如果其他RunLoop中的其他方法重寫%rax,那麼它不會崩潰;否則,如果沒有人重寫%rax,則發生崩潰。

這可以部分解釋爲什麼隨機墜毀。有更好的答案嗎?

相關問題