【问题标题】:Obj C: How to add description to a block object?Obj C:如何向块对象添加描述?
【发布时间】:2016-12-01 09:53:21
【问题描述】:

我有 NSMutableArray 的 void(^)() 块,我想调试这个集合内部发生的事情。现在,如果我尝试打印它,我会得到:

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

我想为每个块添加一个描述字符串并查看它而不是地址(块的顺序很重要)。由于 obj c 块也是对象,所以我有一种感觉。任何人都可以分享一个想法如何做到这一点?

【问题讨论】:

    标签: objective-c block


    【解决方案1】:

    想法 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 运行时,但我想我明白我在做什么。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-04-14
      • 1970-01-01
      • 2021-10-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-01-31
      • 1970-01-01
      相关资源
      最近更新 更多