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