2

Time Profiler Instrument を使用して、アプリの大幅な遅延を特定しました。今、私は問題が何であるかを知っていますが、それについて何をすべきかわかりません。私はARCを使用しており、以下のように「Go」メソッドを呼び出すviewControllerがあります。Time Profiler の結果のスナップショットも含めました。これを解決する方法を知っている人はいますか?ありがとうございました!

メソッドのコードは次のとおりです。

- (void)go {

CGFloat width = self.imageViewA.bounds.size.width;

[UIView animateWithDuration:18.0 delay:0.0 options:UIViewAnimationOptionCurveLinear 
animations:^ {
    self.imageViewA.frame = CGRectOffset(self.imageViewA.frame, -width, 0);
    self.imageViewB.frame = CGRectOffset(self.imageViewB.frame, -width, 0);
    } 
completion:^(BOOL finished) {
    if (self.keepGoing) {
        // now B is where A began, so swap them and reposition B
        UIImageView *temp = self.imageViewA;
        self.imageViewA  = self.imageViewB;
        self.imageViewB = temp;
        self.imageViewB.frame = CGRectOffset(self.view.bounds, 
        self.view.bounds.size.width, 0.0);
        // recursive call, but we don't want to wind up the stack
        [self performSelector:@selector(go) withObject:nil afterDelay:0.0];
        }
    }];
}

これは私の時間プロファイルの結果です:

ここに画像の説明を入力

参考までに、私の .h ファイルも含めておきます。

@interface ViewController : GAITrackedViewController

@property (weak, nonatomic) IBOutlet UIBarButtonItem *lButton;
@property (weak, nonatomic) IBOutlet UIBarButtonItem *rButton;

@property (nonatomic, assign) BOOL keepGoing;
@property (nonatomic, strong) UIImageView *imageViewA;
@property (nonatomic, strong) UIImageView *imageViewB;

- (IBAction)handleLPressed:(id)sender;
- (IBAction)handleRPressed:(id)sender;
@end
4

1 に答える 1

1

多分これはうまくいくかもしれません:

- (void)go {

CGFloat width = self.imageViewA.bounds.size.width;

__weak typeof(self) self_ = self;

[UIView animateWithDuration:18.0 delay:0.0 options:UIViewAnimationOptionCurveLinear 
animations:^ {
    __strong typeof(self) self = self_;
    self.imageViewA.frame = CGRectOffset(self.imageViewA.frame, -width, 0);
    self.imageViewB.frame = CGRectOffset(self.imageViewB.frame, -width, 0);
    } 
completion:^(BOOL finished) {
    __strong typeof(self) self = self_;
    if (self.keepGoing) {
        // now B is where A began, so swap them and reposition B
        UIImageView *temp = self.imageViewA;
        self.imageViewA  = self.imageViewB;
        self.imageViewB = temp;
        self.imageViewB.frame = CGRectOffset(self.view.bounds, 
        self.view.bounds.size.width, 0.0);
        // recursive call, but we don't want to wind up the stack
        [self performSelector:@selector(go) withObject:nil afterDelay:0.0];
        }
    }];
}

これが行うことは、ブロック内のスタックにコピーするのではなく、自己への弱参照を保持することです。よくわかりませんが、これでうまくいくかもしれません。

于 2013-03-12T07:52:49.760 に答える