このようなブレークポイントがあります
_-[UITableViewCell setSelected:]
_
動作しますが、渡されている値を取得する方法がわかりません。
-[UITableViewCell setSelected:(BOOL)what]
と_-[UITableViewCell setSelected:what]
_を試しましたが、まったく機能しません。
パラメータにアクセスするにはどうすればよいですか?
これが機能しない場合は、何が起こっているかを確認するためにDebugUITableViewCell
を作成する必要があります。これは面倒で、多くのコードに影響します。
デバイスでコードをデバッグする場合、ブレークポイントに到達したときのパラメーターは、常にレジスタr0、r1、およびr2にあります。 po $r0
を使用すると、オブジェクトがsetSelectedを受信していることがわかります。 po $r1
を使用すると、セレクターであるため、「Objective-Cの説明はありません」というメッセージが表示されます。 $ r2を調べて、選択がYESまたはNOに設定されているかどうかを確認します。これはi386でも同様の話ですが、どのレジスタが使用されているかをすぐに思い出せません。
シミュレーターのLLDBで使用
p $arg3
最初のパラメータ。
デバッグの目的で、-[UITableViewCell setSelected:]
を独自の実装に置き換えることができます。以下では、UIKitのメソッドの代わりにUITableViewCellSetSelected
が呼び出されます。
static void (*__originalUITableViewCellSetSelected)( UITableViewCell *, SEL, BOOL ) ;
static void UITableViewCellSetSelected( UITableViewCell * self, SEL _cmd, BOOL b )
{
// your code here... (or set a breakpoint here)
NSLog(@"%@<%p> b=%s\n", [ self class ], self, b ? "YES" : "NO" ) ;
(*__originalUITableViewCellSetSelected)( self, _cmd, b ) ; // call original implementation:
}
@implementation UITableViewCell (DebugIt)
+(void)load
{
Method m = class_getInstanceMethod( [ self class ], @selector( setSelected: ) ) ;
__originalUITableViewCellSetSelected = (void(*)(id, SEL, BOOL))method_getImplementation( m ) ;
method_setImplementation( m, (IMP)UITableViewCellSetSelected ) ;
}
@end
_-[UIApplication sendAction:toTarget:fromSender:forEvent:]
_シンボルに基づいて、シンボリックブレークポイントを追加して、どの送信者がどのターゲットにアクションを送信したかを確認できます。
次のコマンドでシンボリックブレークポイントを作成します。
-[UIApplication sendAction:toTarget:fromSender:forEvent:]
_po "Target"
_po $arg4
_po "Sender"
_po $arg5
_出力は次のようになります:"Target" <project.TargetViewController: 0x14ddb1470> "Sender" <UIButton: 0x14de86000; frame = (331 7; 49 30); opaque = NO; layer = <CALayer: 0x174237020>>
したがって、@ Danが言ったように、メソッドパラメータは引数3(_po $arg3
_)で始まります。
ソースコードのないメソッドの場合、次のように機能します。デバッガーがメソッドの最初の行で停止するように、シンボリックブレークポイントを挿入します。一番上のスタックフレームが選択されていることを確認してください。次に:
Objectice-Cメソッドの場合
po $arg1
は自分自身を印刷しますpo $arg3
は最初の引数を出力し、残りの引数は$arg4
、$arg5
などに出力します。C関数では、引数は$arg1
で始まります
これは、IOSデバイスとシミュレーターの両方で機能します。