今天看了一下QQ,微博,facebook等比较知名的App个人页导航栏的设置,由此认识了一下objc_setAssociatedObject,objc_getAssociatedObject,class_getInstanceMethod,class_getClassMethod这个几个方法的是用法
1.首先是class_getInstanceMethod,class_getClassMethod,下面是具体用法
比如我创建一个对象Car;
Car下面有一个类方法,和一个实例化方法
+ (void)drivingCar{
}
- (void)stopCar{
}
接着我们就要实现例子了
Car *car = [[Car alloc] init];
//得到实例化的方法
Method InstanceMethod = class_getInstanceMethod([car class], @selector(stopCar))
//得到类方法
Method method = class_getCalssMethod([Car class], @selector(drivingCar))
有需求的话我们还可以交换两个方法的实现
method_exchangeImplementations(InstanceMethod, method)
2.如果我们需要一个对象关联一个属性,这个属性可以和对象没有任何联系,那么就可以用到objc_setAssociatedObject,objc_getAssociatedObject
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
......
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"提示"
message:@"你在吃饭吗"
delegate:self
cancelButtonTitle:@"好的"
otherButtonTitles:nil];
//然后这里设定关联,此处把indexPath关联到alert上
objc_setAssociatedObject(alert, &kUITableViewIndexKey, indexPath, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
[alert show];
}
- (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex
{
if (buttonIndex == 0) {
NSIndexPath *indexPath = objc_getAssociatedObject(alertView, &kUITableViewIndexKey);
NSLog(@"%@", indexPath);
}
}
网友评论