2

私は高レベルのプログラミング言語 (Python) から来て、Objective-C のこの機能を使用するプロジェクトに取り組んでいるので、自動参照カウントを理解しようとしています。後で必要になる ARC のオブジェクトの割り当て解除で問題が発生することがよくありますが、具体的な例が得られたので、説明を求めたいと思います。

- (void) animateGun:(UIImageView *)gun withFilmStrip:(UIImage *)filmstrip{
  NSMutableArray *frames = [[NSMutableArray alloc] init];
  NSInteger framesno = filmstrip.size.width / gun_width;
  for (int x=0; x<framesno; x++){
    CGImageRef cFrame = CGImageCreateWithImageInRect(filmstrip.CGImage, CGRectMake(x * gun_width, 0, gun_width, gun_height));
    [frames addObject:[UIImage imageWithCGImage:cFrame]];
    CGImageRelease(cFrame);
  }
  gun.image = [frames objectAtIndex:0];
  gun.animationImages = frames;
  gun.animationDuration = .8;
  gun.animationRepeatCount = 1;
  [gun startAnimating];
  dispatch_after(dispatch_time(DISPATCH_TIME_NOW,(arc4random() % 300)/100 * NSEC_PER_SEC), dispatch_get_current_queue(),^{
    [self animateGun:leftGun withFilmStrip:[self getFilmStripForAction:gunShoot andTeam:nil withWeapon:nil]];
  });
}

このコード スニペットの背後にある考え方は単純(UIImageView*)gunです(NSMutableArray *)frames(UIImage *)filmstripアニメーションで使用されるすべてのフレームを含む画像です。アニメーションの最初の反復は機能しますが、2 回目の反復で問題が発生し-[UIImage _isResizable]: message sent to deallocated instance ...ます。これは-[UIImage _contentStretchInPixels]: message sent to deallocated instance ...-[NSArrayI release]: message sent to deallocated instance ...

gun.animationImages = frames;

しかし、理由がわかりません。問題の修正を要求しているわけではありませんが、ここで何が起こっているのかを理解するのに役立ちます。ありがとう。

4

2 に答える 2

0

ARC は、オブジェクトを手動で保持/解放する必要をなくすメカニズムです。これがどのように機能するかを説明する素晴らしいサイトは次のとおりです

「銃」の「左銃」を変更してみてください。ivarを介して使用している場合、おそらくある時点で割り当てが解除されるものだと思います。それ以外の場合、 leftGun は単にスコープ内にありません。

これは次のようになります。

.h ファイル内:

@property (nonatomic, strong) IBOutlet UIImageView *leftGun;

.m ファイルで:

  dispatch_after(dispatch_time(DISPATCH_TIME_NOW,(arc4random() % 300)/100 * NSEC_PER_SEC), dispatch_get_current_queue(),^{
    [self animateGun:gun withFilmStrip:[self getFilmStripForAction:gunShoot andTeam:nil withWeapon:nil]];
  });

また、「gunShoot」がどこから来ているのかよくわかりません。それは列挙型であるはずですか?

編集

leftGunプロパティの定義方法の例を追加しました。ivar に対してプロパティを使用する理由は、メモリ管理のためです。プロパティであるオブジェクトを解放または破棄する場合は、単純に nil に設定すると、必要に応じてプロパティがオブジェクトの解放を処理します。

于 2012-10-08T12:21:37.140 に答える
-1
于 2012-10-08T13:34:05.683 に答える