ObjCMixin:在 Object-C 里实现类似 ruby 的 mixin 机制

项目地址:https://github.com/huandu/ObjCMixin
CocoaPods:pod 'ObjCMixin', '~> 0.1.0'

这是一个脑洞大开的项目……

起因是我看到了 ObjectiveMixin 项目,它可以动态的为 Object-C class 合并其他 class 的功能,但可惜不是很完美,主要存在两个问题:

  • 没有类似 ruby 的 mixin 语法,不够酷炫;
  • Class 的方法修饰其实只是一次性的过程,无需每次 alloc 对象前来做,所以如何能够保证只做一次。

那么 ObjCMixin 实现了什么呢?来来来,我们看看它的威力。

首先,需要声明一个 module 用来做 mixin。

objc// MyModule.h
#import "Mixin.h"

@module(MyModule)
-(void)hello;
@end

实现 module 的函数。

objc// MyModule.m
#import "MyModule.h"

@module_implementation(MyModule)

-(void)hello
{
    NSLog(@"Hello, mixin!");
}

@end

在一个新的 interface 里面使用这个 mixin。

objc// Foo.h
#import "MyModule.h"

// Foo derives from a special base class.
@interface Foo : NSException<MyModule>
@end

在实现文件里面将 MyModule 混合到 Foo 里面。

objc// Foo.m
#import "Foo.h"

@mixin(Foo, MyModule)

@implementation Foo
@end

奇迹般的,Foo 可以使用 MyModule 的所有方法了。

objcFoo *f = [[Foo alloc] init];
[f hello]; // Print "Hello, mixin!" in console.

实现方法极度简单,说出来就会感觉很 low。

主要两点:

  • 用 Object-C runtime api 来复制 class 的方法到另一个 class,详见 class_addMethod 的文档;
  • __attribute__((constructor)) 来声明一个在 main 之前执行的函数,用来一次性的污染 class 方法,干净清晰。

至于有什么用处?好问题,我还没想到!

也许这种 mixin 可以一定程度上满足多继承的需求,例如某些 category 代码不方便通过继承进行耦合,但是代码本身可以重复,那可以考虑一试。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值