
一般写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,足矣。 |