Yet another AOP library for Objective-C, but implement by using libffi. The main goal for this lib is to avoid heavily use of forwardInvocation
, powerful, easy to use and also easy to read.
This lib is inspired by Aspects, JSPatch, NSBlog and sunnyxx's blog, thanks all these people.
A simple example is look like this, provide a block to replace the original implementation, look very similar to Aspects but have a bit difference. You can alter the arguments or return value by modify info.invocation
. If you aren't sure the existing of original implementation, you should call class_addPlaceholderIfNoImplement
fisrt.
[[UIImage nvm_hookInstanceMethod:@selector(imageNamed:)
usingBlock:^void(NVMAspectInfo *info, NSString *name) {
NSLog(@"Load image named %@", name);
[info.invocation invoke];
}];
-
Actually there are some bugs on this lib, Bit Field, Union, Struct contain array. But
bit field
andunion
are also not well supportted by apple'sNSInvocation
, struct contain small array is a bug inlibffi
. All these features used very rare in Objective-C, so it's not a big problem. -
NVMAspects doesn't forbidden you to hook any method, but if you make some changes to method like
alloc
, you should follow the memory management policy, especially inARC
. -
Currently if a class has defined a method, hook this method will change it's
imp
, even if that method is implemented by it's super class. But this is not a big problem, you can distinguish the class by test[self class]
in you block. If the class has not defined a method, you should callclass_addPlaceholderIfNoImplement
first. -
For problem caused by
forwardInvocation
, you can use this keyword to search issues inAspects
orJSPatch
.
add the following line to your Podfile:
pod "NVMAspects"
NVMAspects is released under the MIT license.