2016-08-31 1 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バージョン9.3で時折クラッシュする。

iOS 7-9でテストしたiPhone6/6plusデバイスとiPhone6plusシミュレータでクラッシュすることはありません。

私はそれが間違っていることを知っていますが、なぜこれが起こったのか知りたいのですが、誰かが説明をすることができますか?事前のおかげで〜

+0

imageViewをどこで取ったのですか?それはストーリーボード/ Xibかプログラムかプログラムですか? – Janmenjaya

+0

戻り値の型を.hと.mの順に変更します。これは同じメソッドです。ブレークポイントを設定して、そのメソッド(行)のどこに問題があるかを調べるか、メソッドの宣言がその実装に一致しないためにブレークポイントを設定しようとします。 – Larme

+0

uは* .hと* .mの異なる戻り値をdelcareすることができます。コンパイラは警告をスローするだけでなく、他のファイルでも呼び出すことができ、実際には一致します。それを試してみてください! –

答えて

0

まあ、私の同僚が答えを持っていたが、ここでは詳細は以下のとおりです。

  • まず2背景:%のRAXレジスタの
  • アームアーチstoreメソッドの戻り値。
  • オブジェクトはARCモードですぐに解放されず、 _obj_release_XXXはRunLoopでのを最低優先度とします。

のでshowSeqDiagramは、任意の値を返さないので、%のRAXレジスタには値がありませんが、autoReleasePoolは(優先度が最も低くある)短い時間の後に%のRAXに「UIImageView」OBJを解放してみてください。そのような短い時間に、他のRunLoopの他のメソッドが%raxを上書きすると、クラッシュしません。そうでなければ、誰も%raxを書き換えないとクラッシュしました。

これは、なぜランダムにクラッシュするのかを部分的に説明できます。より良い答えはありますか?

関連する問題