3

醜いバグを絞り込みましたが、nib/Interface Builder の内部にあるように見えるので、次に何をすべきか途方に暮れています。

カスタム ダイアログ ボックスとして機能する IB で作成された UIView があります。メッセージと 2 つのボタンが表示されます。(続行またはキャンセル) どちらのボタンにも、Interface Builder で設定された背景画像があります。

キャンセルボタンの背景画像の扱いに問題があります。NSZombieEnabled を使用して、プログラムを実行しています。ほとんどの場合、以下のメソッドはこれをログに記録します。

-[ModalDialog showInView:title:message:cancelText:proceedText:]
dialogProceedButton <UIButton: 0x7031f10; frame = (286 192; 90 31) // (etc.)
dialogProceedButtonBackground <UIImage: 0x3b36120>
dialogCancelButton <UIButton: 0x3b39cd0; frame = (104 192; 90 31) // (etc.)
dialogCancelButtonBackground <UIImage: 0x3b3a920>

それは完全に正常です。ただし、これを行う場合もあります (いくつかのインターフェイス ボタンをすばやくタップして UI を「急ぐ」と、これをある程度確実に繰り返すことができます)。

-[ModalDialog showInView:title:message:cancelText:proceedText:]
dialogProceedButton <UIButton: 0x7031f10; frame = (286 192; 90 31) // (etc.)
dialogProceedButtonBackground <UIImage: 0x3b36120>
dialogCancelButton <UIButton: 0x3b39cd0; frame = (104 192; 90 31) // (etc.)
*** -[UIImage retain]: message sent to deallocated instance 0x3b3a920

ご覧のとおり、NSZombieEnabled は [キャンセル] ボタンの背景画像の割り当てが解除されていることを検出しましたが、保持メッセージが送信されています。(ただし、私ではありません...その画像はこの1つのボタンにのみ使用され、Interface Builderでのみアクセスされます。その画像にリンクされたIBOutletsまたは変数はありません。)

それで、ええと、今何ですか?

編集:

ゾンビとして捕捉されるのは保持メッセージではない場合もあれば、isKindOfClass である場合もあります。

//(the object address is always dialogCancelButton.currentBackgroundImage)
-[UIImage isKindOfClass:]: message sent to deallocated instance 0x1661f0
//occasionally, these come along, too:
*** NSInvocation: warning: object 0x7e0d0b0 of class '_NSZombie_UIImage' does not implement methodSignatureForSelector: -- trouble ahead
*** NSInvocation: warning: object 0x7e0d0b0 of class '_NSZombie_UIImage' does not implement doesNotRecognizeSelector: -- abort

これは私のカスタム UIViews "showInView" メソッドです:

- (void)showInView:superView 
             title:(NSString*)title 
             message:(NSString*)message 
             cancelText:(NSString*)cancelText 
             proceedText:(NSString*)proceedText {

NSLog(@"%s",__PRETTY_FUNCTION__);
NSLog(@"dialogProceedButton %@", dialogProceedButton);
NSLog(@"dialogProceedButtonBackground %@", dialogProceedButton.currentBackgroundImage);
NSLog(@"dialogCancelButton %@", dialogCancelButton);
NSLog(@"dialogCancelButtonBackground %@", dialogCancelButton.currentBackgroundImage);



CGRect rect;
dialogTitle.text = title;
dialogMessage.text = message;
[dialogProceedButton setTitle:proceedText forState:UIControlStateNormal];

if (cancelText == @"") { // SINGLE BUTTON DIALOG
  dialogCancelButton.hidden = YES;
  rect = [dialogProceedButton frame];
  rect.origin.x = 195; //center the button 
  [dialogProceedButton setFrame:rect];
} else {
  [dialogCancelButton setTitle:cancelText forState:UIControlStateNormal];
  dialogCancelButton.hidden = NO;
  rect = [dialogProceedButton frame];
  rect.origin.x = 286; //button on right of dialog box 
  [dialogProceedButton setFrame:rect];
}

[UIView beginAnimations:@"modalAppears" context:nil];
[UIView setAnimationDuration:0.5];
[superView addSubview:self];
self.alpha = 1.0;
[UIView commitAnimations];
}

ありがとう!

4

2 に答える 2

3

わかりました、これは一体何です。[続行]ボタンと[キャンセル]ボタンの画像を逆にしてみることにしました。その結果、[続行]ボタンの画像がクラッシュを引き起こしました(同じように断続的に)。プロジェクトとInterfaceBuilderから画像を完全に削除しました。次に、新しい名前で新しいコピーを追加し、接続しました。

以前のセットアップでは、クラッシュを約40%の確率で再現できました。これらの変更後、クラッシュを再現するために約20回試行しましたが、現在はまったく再現できません。

画像またはペン先が破損している場合、なぜ、なぜ、なぜそれがランダム/断続的な症状を引き起こすのでしょうか?

なんてこと。それがうまくそして本当に修正されることを願っています。


アップデート:

そして...それでもう少しあります。偶然にも、(不完全な)指示ビューでプレースホルダーと同じ画像を使用していたことがわかりました。そこでの一時的な便宜のために、私は[UIImage imageNamed:]を使用して画像を取得していました。適切に割り当てられ、解放されていましたが、imageNamed:メソッドやキャッシュとのIBの連携は完全ではないようです。

行って画像の新しいコピーを取得したときに、新しい名前も付けたという事実は、IBボタンの画像と一時的なプレースホルダーの画像がまったく同じ画像ではなくなったことを意味します。

理論をテストするために、数日前のプロジェクトのバックアップに戻りました。私がしたのは、指示ビューに別のプレースホルダー画像を使用するように指示することだけでした。クラッシュが停止しました。

これはおそらくSDKのバグです。IBで画像を使用せず、imageNamed:を使用して他の場所でも同じ画像を使用する理由はありません。最近のいずれかで気が狂ったり退屈したりした場合は、これをサンプルプロジェクトにまとめて、Appleレーダーに送信します。

于 2009-10-16T00:22:06.517 に答える
0

XIB ファイルはどのようにビューに接続されていますか? どの IBOutlets を定義しましたか? あなたが説明した方法で問題を解決したとは思えません。

于 2009-10-16T05:31:58.800 に答える