このようなことは、デバッグ時に夢中になります:
(lldb) p self.bounds
error: unsupported expression with unknown type
error: unsupported expression with unknown type
error: 2 errors parsing expression
(lldb) p (CGRect)self.bounds
error: unsupported expression with unknown type
error: unsupported expression with unknown type
error: C-style cast from '<unknown type>' to 'CGRect' is not allowed
error: 3 errors parsing expression
(lldb) p [self bounds]
error: 'bounds' has unknown return type; cast the call to its declared return type
error: 1 errors parsing expression
(lldb) p (CGRect)[self bounds]
(CGRect) $1 = Origin=(x=0, y=0) size=(width=320, height=238)
(lldb) You suck!
error: 'You' is not a valid command.
(lldb) …
最初の3回の試行が失敗したのはなぜですか? self.bounds
を印刷する簡単な方法はありますか?ありがとう。
Xcode 6.3以降、より良いソリューションがあります。つまり、LLDBのUIKitをインポートして、これらのタイプを知る必要があります:expr @import UIKit
。 この記事 をチェックして、あなたの人生をさらに楽にするいくつかのトリックを学んでください。
あなたはそれにアクセスすることができます
p (CGRect)[view bounds]
または
p view.layer.bounds
view.bounds
は実際にはview.layer.bounds
です
[UIView bounds]
の型情報はlldb
では利用できないようです
あなたが大好きになる Xcode 6.3 +
[〜#〜] tldr [〜#〜]
(lldb) e @import UIKit
(lldb) po self.view.bounds
LLDBのObjective-C式パーサーは、モジュールをインポートできるようになりました。後続の式は、モジュールで定義された関数とメソッドのプロトタイプに依存できます。
(lldb) p @import Foundation
(lldb) p NSPointFromString(@"{10.0, 20.0}");
(NSPoint) $1 = (x = 10, y = 20)
Xcode 6.3より前では、デバッグ情報のないメソッドと関数は、戻り値の型を指定するために明示的な型キャストを必要としました。モジュールをインポートすることにより、開発者はこの情報を手動で決定および指定する、より労働集約的なプロセスを回避できます。
(lldb) p NSPointFromString(@"{10.0, 20.0}");
error: 'NSPointFromString' has unknown return type; cast the call to its declared return type
error: 1 errors parsing expression
(lldb) p (NSPoint)NSPointFromString(@"{10.0, 20.0}”);
(NSPoint) $0 = (x = 10, y = 20)
モジュールをインポートするその他の利点には、より優れたエラーメッセージ、64ビットデバイス上で実行する場合の可変機能へのアクセス、潜在的に不正な推測引数タイプの排除が含まれます。
[〜#〜] ps [〜#〜]:pとpoも混同する場合
p == print == expression -- == e --
po == expression -O -- == e -O --
--
は、command+flag
とinputs
の間の区切り文字です
-O
フラグは、オブジェクトdescription
メソッドを呼び出すためのものです
Xcode 6.3では、UIKitをインポートしてから、フレームまたはビューの境界を印刷できます
expr @import UIKit
p self.view.bounds
LLDBはp
を使用する場合、メッセージ送信のドット表記をサポートしていません。そのためです。
p self.bounds
動作しませんが、
p [self bounds]
します。
(ただし、po
を使用すると、オブジェクトに対して実際にサポートされます)
また、LLDBには実行時に利用できる非オブジェクトの型情報がないため、戻り値をキャストして明示的に型を指定する必要があります。
これを実行したときのコンテキストが何であったかはわかりません。しかし、lldbはself
のタイプを見つけることができないようです。
Lldbがself.bounds
を評価するには、self
のタイプが何らかのクラスにプロパティbounds
を持っていることを知る必要があります。 self
はObjC型であると想定することはできません。そのようなコンテキストで呼び出すことができるためです。
void test()
{
struct
{
int bounds;
} self;
}
エラーerror: unsupported expression with unknown type
が発生します
ただし、[self bounds]
を使用して呼び出すと、[]
構文はObjC型にのみ適用されるため、lldbはself
がObjC型であることがわかります。ただし、self
の型は明確ではないため、[self bounds]
の結果を評価することはできません。したがって、CGRect
にキャストする必要があります。
次の式で試してください、
p self.view.bounds.size.width
または使用、
po self.view
p-印刷は、通常/単純な値の印刷にのみ使用されますが、po-オブジェクトの印刷は、オブジェクトの値を印刷するためにNSLogと同じように機能します
@ an0の答えを試しましたexpr @import UIKit
、しかし、うまくいきませんでした。
次に、pchファイルを追加し、次のコード行をファイルに追加します。
#ifndef PrefixHeader_pch
#define PrefixHeader_pch
#ifdef __OBJC__
#import <UIKit/UIKit.h>
#endif
#endif /* PrefixHeader_pch */
次に、pchファイルをプロジェクトにリンクします。
アプリを再度実行すると、lldbコンソールでドット表記を使用できます。
(lldb) po self.view.bounds
Pchファイルを追加する方法については、こちらの回答を参照してください Xcode 6のPCHファイル