2016-07-27 8 views
1

私はvoid(^)()ブロックのNSMutableArrayを持っており、このコレクションの内部で何が起こっているのかをデバッグしたいと思います。今、私はそれを印刷しようとする場合、私は得る:私は各ブロックに説明文字列を追加し、代わりのアドレスを(ブロックの順序が重要です)見たいObj C:ブロックオブジェクトに説明を追加するにはどうすればよいですか?

(lldb) po self.blockArray 
<__NSArrayM 0x1712f090>(
<__NSMallocBlock__: 0x19d64e30>, 
<__NSMallocBlock__: 0x19d60b50>, 
<__NSMallocBlock__: 0x19cbb2b0>, 
<__NSMallocBlock__: 0x19cbaa30>, 
<__NSMallocBlock__: 0x19c83100>, 
<__NSMallocBlock__: 0x170cbef0> 
) 

。 obj cブロックはオブジェクトでもあるので、私は可能な限り伐採しています。だれでもアイデアを共有できますか?

答えて

0

アイデア1:作成時にブロックと説明を記録し、手動で識別します。

アイデア2:デバッグと実験のためにのみ、自己責任でを使用してください。 descriptionメソッドをNSBlockに追加し、関連する説明オブジェクトを各ブロックに追加します。私のテストアプリ:

@implementation AppDelegate 

static char kAssociatedObjectKey; 

typedef void (^MyBlockType)(void); 

- (NSString *)myDescription { 
    NSString *description = [super description]; 
    id object = objc_getAssociatedObject(self, &kAssociatedObjectKey); 
    if (object) 
     description = [description stringByAppendingFormat:@" %@", object]; 
    return description; 
} 

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 
    Class blockClass = NSClassFromString(@"NSBlock"); 
    Method descriptionMethod = class_getInstanceMethod([self class], @selector(myDescription)); 
    BOOL didAddMethod = class_addMethod(blockClass, @selector(description), 
     method_getImplementation(descriptionMethod), method_getTypeEncoding(descriptionMethod)); 

    MyBlockType a = ^{}; 
    objc_setAssociatedObject(a, &kAssociatedObjectKey, @"block a", OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
    MyBlockType b = ^{}; 
    objc_setAssociatedObject(b, &kAssociatedObjectKey, @"block b", OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
    MyBlockType c = ^{}; 
    objc_setAssociatedObject(c, &kAssociatedObjectKey, @"block c", OBJC_ASSOCIATION_RETAIN_NONATOMIC); 
    NSArray *array = @[a, b, c]; 
    NSLog(@"%@", array); 
} 

@end 

PS。おそらく、アイデア2は良い考えではないでしょう。私はObjective-Cランタイムに慣れていませんが、私が何をやっているのか理解していると思います。

関連する問題