次のコードを取得しました。
- (void) hide_waiting_activity
{
[UIView beginAnimations:nil context:NULL]; {
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView setAnimationDuration:.5];
self.waiting_view.alpha = 0;
self.waiting_label.alpha = 0;
self.activity_indicator.alpha = 0;
} [UIView commitAnimations];
}
問題: クラッシュする場合としない場合があります。クラッシュした場合、コンソール出力は次のようになります。
2013-02-07 18:16:21.658 ドライバー [5912:907] -[NSISRestrictedToNonNegativeVariable カウント]: 認識されないセレクターがインスタンス 0x1dd3aea0 に送信されまし た例外 'NSInvalidArgumentException'、理由: '-[NSISRestrictedToNonNegativeVariable カウント]: 認識されないセレクターがインスタンス 0x1dd3aea0 に送信されました' *First throw call stack: (0x342e03e7 0x3bfd1963 0x342e3f31 0x342e264d 0x3423a208 0x34c90d5b 0x34c9a6c3 0x34c9a56f 0x34c9a781 0x34c9acf1 0x34c99d6b 0x34c9ac31 0x34c92393 0x34c94f01 0x34c95ed7 0x34c9ecab 0x36527519 0x36527689 0x365277ab 0x3652791f 0x36527acf 0x34c95997 0x36527a41 0x3652aad1 0x3652d0d9 0x3652cfe3 0x34226acd 0x3652cf97 0x34226acd 0x3652cf97 0x34226acd 0x3652cf97 0x34226acd 0x3652cf97 0x34226acd 0x3652cf97 0x34226acd 0x3652cf97 0x34226acd 0x3652cf97 0x34226acd 0x3652cf97 0x34c95997 0x36526f3d 0x361623dd 0x35e9e513 0x35e9e0b5 0x35e9efd9 0x35e9e9c3 0x35e9e7d5 0x35e9e639 0x342b5941 0x342b3c39 0x342b3f93 0x3422723d 0x342270c9 0x37e0533b 0x361432b9 0xd3871 0xc29d8) libc++abi.dylib: terminate called throwing an exception
対応するスタックトレースは次のようになります。
またはこのようなもの:
driver(5930,0x3df85b78) malloc: * オブジェクト 0x1e565990 のエラー: 解放されるポインターが割り当てられませんでした *デバッグするために malloc_error_break にブレークポイントを設定します (lldb)
次に、スタックトレースは次のようになります
私は完全に無知です。誰かがアイデアを持っていますか?私はios6.1を使用しています。
更新: ネストされた内側の括弧にコメントを付けても、何も変わりません:
[UIView beginAnimations:nil context:NULL]; {
//[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
//[UIView setAnimationDuration:.5];
self.waiting_view.alpha = 0;
self.waiting_label.alpha = 0;
self.activity_indicator.alpha = 0;
} [UIView commitAnimations];
更新 2: 中かっこを削除した後も、説明どおりにアプリがクラッシュします。
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView setAnimationDuration:.5];
self.waiting_view.alpha = 0;
self.waiting_label.alpha = 0;
self.activity_indicator.alpha = 0;
[UIView commitAnimations];
更新 3: これは、hide_waiting_activity の影響を受ける UI 要素を含む完全なコードです。
MainNavigationController.h
//Waiting overlay
@property (nonatomic,strong) UIActivityIndicatorView* activity_indicator;
@property (nonatomic,strong) UIImageView* waiting_view;
@property (nonatomic,strong) UILabel* waiting_label;
MainNavigationController.m
@implementation MainNavigationController
@synthesize activity_indicator;
@synthesize waiting_view;
@synthesize waiting_label;
...
- (void)viewDidLoad
{
[super viewDidLoad];
//Create a transparent waiting indicator view that is shown to the user while the app is working in background
waiting_view = [[UIImageView alloc] initWithFrame:CGRectMake( 0, 64.f /* top navigation bar is 64.f */, 320, 480 )];
[waiting_view setImage:[UIImage imageNamed:@"Main_Menu_Background.png"]];
waiting_view.backgroundColor = [UIColor clearColor];
self.activity_indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
[self.activity_indicator setColor:[UIColor blackColor]];
[self.activity_indicator startAnimating];
self.activity_indicator.center = CGPointMake( 160.f, (240.f-64.f) );
[waiting_view addSubview:activity_indicator];
waiting_label = [[UILabel alloc] initWithFrame:CGRectMake( 110.f, (240.f-64.f)+30.f, 100.f, 16.f)];
waiting_label.font = [UIFont boldSystemFontOfSize:13.f];
waiting_label.textColor = [UIColor blackColor];
waiting_label.backgroundColor = [UIColor clearColor];
waiting_label.textAlignment = UITextAlignmentCenter;
waiting_label.text = NSLocalizedString(@"Please_Wait_Text", @"");
[waiting_view addSubview:waiting_label];
[self.view addSubview:waiting_view];
[self.view bringSubviewToFront:self.activity_indicator];
self.waiting_view.hidden = YES;
self.activity_indicator.hidden = YES;
...
}
- (void) show_waiting_activity
{
if( self.waiting_view.alpha == 1 && self.waiting_view.hidden == NO )
return;
self.waiting_view.hidden = NO;
self.activity_indicator.hidden = NO;
[UIView beginAnimations:nil context:NULL]; {
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView setAnimationDuration:.2];
self.waiting_view.alpha = 1;
self.waiting_label.alpha = 1;
self.activity_indicator.alpha = 1;
} [UIView commitAnimations];
}
- (void) hide_waiting_activity
{
[UIView beginAnimations:nil context:NULL];
[UIView setAnimationCurve:UIViewAnimationCurveEaseInOut];
[UIView setAnimationDuration:.5];
self.waiting_view.alpha = 0;
self.waiting_label.alpha = 0;
self.activity_indicator.alpha = 0;
[UIView commitAnimations];
}
私は、このコードのどこで UI 要素がこの 0.5 秒で破棄される可能性があるかを自問しています。