CoreData のオブジェクトを lldb の print-object で見てみた
参考にしたのはこのサイト。
●furbo.org · Debugging Core Data Objects
とりあえず適当にブレークポイントを置いて lldb のコマンドラインへ。
今回はあり気なこんなコードの所に置いてみた。
NSManagedObject *mobj = [self.fetchedResultsController objectAtIndexPath:indexPath];で、このオブジェクトの中身だけど、lldb のコマンドラインでこんな感じでサックリ中身が見られる。
(lldb) po mobj (NSManagedObject *) $10 = 0x087900e0 <DaySleep: 0x87900e0> (entity: DaySleep; id: 0x878d2b0 <x-coredata://7126E583-F5B8-4EE3-A91E-AE29ABBD7315/DaySleep/p124> ; data: { dayAllNight = 0; dayDate = "2012-06-22 05:30:00 +0000"; dayDreamLog = nil; dayOtherLog = nil; daySectionString = "2012-06"; daySleepStatus = 0; dayString = "2012-06-22"; dayTotalSleepDuration = "4.75"; sleeps = "<relationship fault: 0x929c1c0 'sleeps'>"; }) (lldb)で、リレーションの﹁sleeps﹂の中身は valueForKey を使って確認する。
(lldb) po [mobj valueForKey:@"sleeps"]
(id) $12 = 0x0929c1c0 Relationship 'sleeps' fault on managed object (0x87900e0) <DaySleep: 0x87900e0> (entity: DaySleep; id: 0x878d2b0 <x-coredata://7126E583-F5B8-4EE3-A91E-AE29ABBD7315/DaySleep/p124> ; data: {
dayAllNight = 0;
dayDate = "2012-06-22 05:30:00 +0000";
dayDreamLog = nil;
dayOtherLog = nil;
daySectionString = "2012-06";
daySleepStatus = 0;
dayString = "2012-06-22";
dayTotalSleepDuration = "4.75";
sleeps = "<relationship fault: 0x929c1c0 'sleeps'>";
})
(lldb)
あれ? 変わってないんじゃ…。
とりあえず、sleeps の全てのオブジェクトを見てみると…
(lldb) po [[mobj valueForKey:@"sleeps"] allObjects]
(id) $13 = 0x0d575310 <__NSArrayI 0xd575310>(
<Sleep: 0xd575080> (entity: Sleep; id: 0xd575c10 <x-coredata://7126E583-F5B8-4EE3-A91E-AE29ABBD7315/Sleep/p186> ; data: <fault>)
)
(lldb)
1つオブジェクトが見つかった。
で、それを確認してみる。
(lldb) po [[[[mobj valueForKey:@"sleeps"] allObjects] lastObject] description]
(id) $16 = 0x09361f50 <Sleep: 0xd575080> (entity: Sleep; id: 0xd575c10 <x-coredata://7126E583-F5B8-4EE3-A91E-AE29ABBD7315/Sleep/p186> ; data: {
daySleep = "0x878d2b0 <x-coredata://7126E583-F5B8-4EE3-A91E-AE29ABBD7315/DaySleep/p124>";
endDateTime = "2012-06-22 05:30:00 +0000";
sleepDuration = "4.75";
startDateTime = "2012-06-22 00:45:00 +0000";
targetSleep = 8;
theDate = "2012-06-22 05:30:00 +0000";
})
(lldb)
ちゃんと見られた。
最後にもう一回、元のオブジェクトの description を見てみる。
(lldb) po mobj (NSManagedObject *) $17 = 0x087900e0 <DaySleep: 0x87900e0> (entity: DaySleep; id: 0x878d2b0 <x-coredata://7126E583-F5B8-4EE3-A91E-AE29ABBD7315/DaySleep/p124> ; data: { dayAllNight = 0; dayDate = "2012-06-22 05:30:00 +0000"; dayDreamLog = nil; dayOtherLog = nil; daySectionString = "2012-06"; daySleepStatus = 0; dayString = "2012-06-22"; dayTotalSleepDuration = "4.75"; sleeps = ( "0xd575c10 <x-coredata://7126E583-F5B8-4EE3-A91E-AE29ABBD7315/Sleep/p186>" ); }) (lldb)sleeps の中身のオブジェクトが表示されてる。 どうやら、一回確認をすると表示されるようになるみたい。
UIView の階層を lldb の print-object で見てみた
iPhone の画面に張り付いている UIView の階層をコマンド一つで確認できるなんて知らなかった…。
こんな感じ。
というわけで、lldb でpoする時って objective-c のコードを入力できるのが面白いな〜。
(lldb) po [[self view] recursiveDescription]
(id) $1 = 0x0945f030 <UIView: 0x8777ac0; frame = (0 0; 320 411); autoresize = W+H; layer = <CALayer: 0x8777bd0>>
| <UIButton: 0x9450b80; frame = (25 63; 270 113); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x9450c10>>
| | <UIImageView: 0xcd68790; frame = (0 0; 270 113); clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0xcd6b060>>
| | <UIButtonLabel: 0x8779da0; frame = (270 47; 0 19); text = 'Sleep'; clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x8752c20>>
| <UIImageView: 0x8774700; frame = (0 0; 320 56); autoresize = RM+BM; userInteractionEnabled = NO; layer = <CALayer: 0x8776780>>
| <UIButton: 0x944efb0; frame = (25 186; 270 113); opaque = NO; autoresize = RM+BM; layer = <CALayer: 0x944f070>>
| | <UIImageView: 0xcd714d0; frame = (0 0; 270 113); clipsToBounds = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0xcd71510>>
| | <UIButtonLabel: 0x9450670; frame = (0 0; 0 0); clipsToBounds = YES; hidden = YES; opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x9450740>>
| <UILabel: 0x87779d0; frame = (25 336; 270 21); text = ''; clipsToBounds = YES; opaque = NO; autoresize = RM+BM; userInteractionEnabled = NO; layer = <CALayer: 0x8777a40>>
| <UILabel: 0x877a5d0; frame = (25 307; 270 21); text = ''; clipsToBounds = YES; opaque = NO; autoresize = RM+BM; userInteractionEnabled = NO; layer = <CALayer: 0x877a110>>
| <UIView: 0x92536a0; frame = (100 146; 120 120); clipsToBounds = YES; alpha = 0.3; hidden = YES; tag = 10001; layer = <CALayer: 0x9254b60>>
| <UIActivityIndicatorView: 0x9251b90; frame = (141 187; 37 37); hidden = YES; tag = 10002; layer = <CALayer: 0x92505c0>>
| | <UIImageView: 0x9274da0; frame = (0 0; 37 37); opaque = NO; userInteractionEnabled = NO; layer = <CALayer: 0x9254cc0>>
| <UIImageView: 0x87774e0; frame = (0 411; 320 50); autoresize = RM+BM; userInteractionEnabled = NO; layer = <CALayer: 0x87769c0>>
(lldb)
で、この画面はこんな画面。
![f:id:paraches:20120704163812p:image f:id:paraches:20120704163812p:image](https://cdn-ak.f.st-hatena.com/images/fotolife/p/paraches/20120704/20120704163812.png)
@interface MainViewController : UIViewController <UIGestureRecognizerDelegate> { UIButton *sButton; UIButton *gButton; UILabel *messageLabel; UILabel *messageLabel2; UIImageView *bannerImageView; UIImageView *bottomBannerImageView; }あ、UIActivityIndicatorView はここに出てないけどコードの中で作って貼り付けてある。
というわけで、lldb でpoする時って objective-c のコードを入力できるのが面白いな〜。