BlockTracker 1.1.1

BlockTracker 1.1.1

杨晓宇 维护。



BlockTracker

CI Status Carthage compatible GitHub release Twitter Follow

BlockTracker

BlockTracker 可以跟踪方法中的 block 参数。它基于 BlockHook

📚文章

追踪 Objective-C 方法中的 Block 参数对象

🌟功能

  • 易于使用。
  • 保持代码清晰。
  • 允许修改返回值和参数。
  • 跟踪方法所有 block 参数。
  • 跟踪所有 NSMallocBlock
  • 自管理的追踪器。
  • 支持 CocoaPods 和 Carthage。

🔮示例

示例项目 "BlockTrackerSample" 仅支持 iOS 平台。

🐒如何使用

在方法中跟踪 blocks

您可以在参数中追踪 blocks。这个方法返回一个 BTTracker 实例以获得更多控制。当您不再需要追踪它时,可以调用 stop 来停止 BTTracker

__unused BTTracker *tracker = [self bt_trackBlockArgOfSelector:@selector(performBlock:) callback:^(BHInvocation * _Nonnull invocation) {
    switch (invocation.mode) {
        case BlockHookModeBefore:
            NSLog(@"Before block:%@, mangleName:%@", invocation.token.block, invocation.token.mangleName);
            break;
        case BlockHookModeAfter:
            NSLog(@"After block:%@, mangleName:%@", invocation.token.block, invocation.token.mangleName);
            objc_setAssociatedObject(invocation.token, @"invoked", @YES, OBJC_ASSOCIATION_RETAIN);
            break;
        case BlockHookModeDead:
            NSLog(@"Block Dead! mangleName:%@", invocation.token.mangleName);
            BOOL invoked = [objc_getAssociatedObject(invocation.token, @"invoked") boolValue];
            if (!invoked) {
                NSLog(@"Block Not Invoked Before Dead! %@", invocation.token.mangleName);
            }
            break;
        default:
            break;
    }
}];
    
// invoke blocks
NSString *word = @"I'm a block";
[self performBlock:^{
    NSLog(@"%@", word);
}];
// stop tracker in future
//    [tracker stop];
// blocks will die

- (void)performBlock:(void(^)(void))block {
    dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(1 * NSEC_PER_SEC)), dispatch_get_main_queue(), block);
}

@end

以下是日志:

Hook Block Arg mangleName:__42-[BlockTrackerSampleTests testTrackMethod]_block_invoke_2, in selector:performBlock:
Before block:<__NSMallocBlock__: 0x600000c71aa0>, mangleName:__42-[BlockTrackerSampleTests testTrackMethod]_block_invoke_2
I'm a block
After block:<__NSMallocBlock__: 0x600000c71aa0>, mangleName:__42-[BlockTrackerSampleTests testTrackMethod]_block_invoke_2
Block Dead! mangleName:__42-[BlockTrackerSampleTests testTrackMethod]_block_invoke_2

跟踪一批 blocks。

setMallocBlockCallback(^(BHInvocation * _Nonnull invocation) {
    switch (invocation.mode) {
        case BlockHookModeBefore: {
            NSLog(@"Before block:%@, mangleName:%@", invocation.token.block, invocation.token.mangleName);
            break;
        }
        case BlockHookModeAfter: {
            NSLog(@"After block:%@, mangleName:%@", invocation.token.block, invocation.token.mangleName);
            objc_setAssociatedObject(invocation.token, @"invoked", @YES, OBJC_ASSOCIATION_RETAIN);
            break;
        }
        case BlockHookModeDead: {
            NSLog(@"Block Dead! mangleName:%@", invocation.token.mangleName);
            BOOL invoked = [objc_getAssociatedObject(invocation.token, @"invoked") boolValue];
            if (!invoked) {
                NSLog(@"Block Not Invoked Before Dead! %@", invocation.token.mangleName);
            }
            break;
        }
        default:
            break;
    }
});

📲安装

CocoaPods

CocoaPods 是 Cocoa 项目的依赖项管理器。您可以使用以下命令安装它:

$ gem install cocoapods

使用 CocoaPods 将 BlockTracker 集成到您的 Xcode 项目中,请在您的 Podfile 中指定它

source 'https://github.com/CocoaPods/Specs.git'
platform :ios, '8.0'
use_frameworks!
target 'MyApp' do
	pod 'BlockTracker'
end

您需要将 "MyApp" 替换为您项目的名称。

然后,运行以下命令

$ pod install

Carthage

Carthage 是一个去中心化的依赖关系管理器,它可以构建您的依赖关系并提供二进制框架。

您可以使用以下命令通过 Homebrew 安装 Carthage

$ brew update
$ brew install carthage

要使用 Carthage 将 BlockTracker 集成到您的 Xcode 项目中,请在您的 Cartfile 中指定它

github "yulingtianxia/BlockTracker"

运行 carthage update 命令以构建框架,并将构建的 BlockTrackerKit.framework 拖入您的 Xcode 项目中。

手动

只需将 BlockTracker 文件夹中的源文件拖放到您的项目中。

❤️贡献

  • 如果您 需要帮助 或者想 提问一般问题,请打开一个 issue。
  • 如果您 发现了错误,请打开一个 issue。
  • 如果您 有功能请求,请打开一个 issue。
  • 如果您 想做出贡献,提交一个 pull request。

✨ 作者

yulingtianxia, [email protected]

🔨 许可证

BlockTracker 在 MIT 许可证下可用。有关更多信息,请参阅 LICENSE 文件。