一般写initWithFrame:如下
- (id)initWithFrame:(CGRect)frame
{
if (self = [super initWithFrame]) {
// do something ...
}
return self;
}
在网上看到经常有人进行这样的method swizzling,代码如下:
- (id)swizzled_initWithFrame:(CGRect)frame
{
// This is the confusing part (article explains this line).
id result = [self swizzled_initWithFrame:frame];
// Safe guard: do we have an UIView (or something that has a layer)?
if ([result respondsToSelector:@selector(layer)]) {
// Get layer for this view.
CALayer *layer = [result layer];
// Set border on layer.
layer.borderWidth = 2;
layer.borderColor = [[UIColor redColor] CGColor];
}
// Return the modified view.
return result;
}
+ (void)load
{
Method original, swizzle;
// Get the "- (id)initWithFrame:" method.
original = class_getInstanceMethod(self, @selector(initWithFrame:));
// Get the "- (id)swizzled_initWithFrame:" method.
swizzle = class_getInstanceMethod(self, @selector(swizzled_initWithFrame:));
// Swap their implementations.
method_exchangeImplementations(original, swizzle);
}
想问下,swizzled_initWithFrame:这个方法中并没有发送[super initWithFrame]这个消息,那如何保证super initWithFrame了呢?
v2ex上大神多,请轻喷!谢谢:)
1
ambitiouspei 2015-04-07 17:17:54 +08:00
在load 方法里, swizzled_initWithFrame: 和 initWithFrame: 实现调换了,以后调用initWithFrame: 其实实际实现就是 swizzled_initWithFrame: -> initWithFrame: > (super) initWithFrame:
|
2
wezzard 2015-04-08 10:30:46 +08:00
樓主連 Swizzle 的目標是哪個 class 都沒有搞清楚呢
swizzled initializer 裏面訪問了 CALayer 的 designated initializer,足矣。 |