当前位置: 首页 > news >正文

桐庐城乡建设局网站中国互联网站建设中心建站中心

桐庐城乡建设局网站,中国互联网站建设中心建站中心,视频号下载器手机版,网站开发和app的区别一般来说#xff0c;系统提供的方法已经足够开发了#xff0c;但是有的时候有些需求用普通方法不好做。 如#xff1a;在所有的viewcontroll 的viewwillappear#xff1a;方法之前打个log 你可能会这么做#xff1a; 1. 建一个uiviewcontroll 父类#xff0c;重写viewwil…一般来说系统提供的方法已经足够开发了但是有的时候有些需求用普通方法不好做。 如在所有的viewcontroll 的viewwillappear方法之前打个log 你可能会这么做 1. 建一个uiviewcontroll 父类重写viewwillappear方法调用super viewwillappear 方法之前加上log 2. 所有新建的uiviewcontroller 继承第一步生成的 确实你是完成这样的功能可是你做了那么多的修改基本每个uiviewcontroller都去修改了父类这种方法太过于笨重了   本文提供了简单地方法即可实现 我的理解中object-c 的类调用方法是根据三个元素来定义的。  1. 方法代表类定义中一个方法类型typedef struct objc_method *Method 2. SEL 选择器typedef struct objc_selector *SEL一个方法在运行时的名字常见的有 [self performSelector:selector(somemethod:) withObject:nil afterDelay:0.5]; selector(somemethod:)作为方法的入口 3. 方法的实现入口typedef id (*IMP)(id, SEL, …) 这三个元素确定了具体调用哪一个函数   直接看代码   [objc] view plaincopyprint? #import UIViewControllerTracking.h  #import objc/runtime.h    implementation UIViewController (Tracking)     (void)load {      NSString *className  NSStringFromClass(self.class);      NSLog(classname %, className);      static dispatch_once_t onceToken;      dispatch_once(onceToken, ^{          Class class  [self class];                    // When swizzling a class method, use the following:          // Class class  object_getClass((id)self);                    SEL originalSelector  selector(viewWillAppear:);          SEL swizzledSelector  selector(xxx_viewWillAppear:);                    Method originalMethod  class_getInstanceMethod(class, originalSelector);          Method swizzledMethod  class_getInstanceMethod(class, swizzledSelector);                    BOOL didAddMethod           class_addMethod(class,                          originalSelector,                          method_getImplementation(swizzledMethod),                          method_getTypeEncoding(swizzledMethod));                    if (didAddMethod) {              class_replaceMethod(class,                                  swizzledSelector,                                  method_getImplementation(originalMethod),                                  method_getTypeEncoding(originalMethod));          } else {              method_exchangeImplementations(originalMethod, swizzledMethod);          }      });  }     我们category重写了NSObject的 load 方法oc提供了objc/runtime.h类让我们获取这些东西同时还提供了对类方法操作的函数 我们想的是直接用一个方法替换掉系统的方法然后把一些自定义的动作加到方法中 我们只想运行一次就够了所以使用了 dispatch_once(onceToken, ^{ …… }接下来给类添加了新方法 把新方法和系统方法替换     [objc] view plaincopyprint? #pragma mark - Method Swizzling    - (void)xxx_viewWillAppear:(BOOL)animated {      NSLog(viewWillAppear: %, self);      [self xxx_viewWillAppear:animated];  }   但是新方法实现的时候调用的是 [self xxx_viewwillAppear:animated]; 可能你会疑惑   这是因为我们在上面已经用xxx_viewwillAppear 和 viewwillAppear 互换了。所以实际上执行的是系统的viewwillAppear 这个时候可能你又有疑问了为什么实现是- (void)xxx_viewWillAppear:(BOOL)animated{} 这样的 这是因为 SEL swizzledSelector selector(xxx_viewWillAppear:); 拿的就是我们新写的方法。 可以结合这篇博客看配图很容易懂 http://blog.csdn.net/yiyaaixuexi/article/details/9374411   以及这篇对SEL讲的比较清楚 http://blog.csdn.net/fengsh998/article/details/8612969 代码下载地址 https://github.com/holysin/Method_swizzle 1  Method nameMethod  class_getInstanceMethod(Class class,SEL name);//得到实例方法 参数:class类名  name 方法名 理解:通过类名和方法名来得到方法(c函数)   2 method_getImplementation(Method method) 参数:method 方法 理解:通过方法来得到它的实现     3 BOOL class_addMethod(Class cls, SEL name, IMP imp, const char *types) 理解:将所给的name(方法名)的方法实现,被imp(方法的实现)代替 cls被添加方法的类 name可以理解为方法名这个貌似随便起名 imp实现这个方法的函数  types一个定义该函数返回值类型和参数类型的字符串这个具体会在后面讲   4 class_replaceMethod(Class class,SEL  B, method_getImplementation(Method AMethod), method_getTypeEncoding(Method AMethod)); 参数:class :方法所属的类 B:将被替换其实现的方法名    AMethod:由A生成的方法(c函数) 理解:用A的方法实现来代替B的方法实现 5 method_exchangeImplementations(SEL A, SEL B); 理解:交换两个方法的实现 void swizzle_method(Class class,SEL originalSelector,SEL swizzledSelector) {     Method originalMethod class_getInstanceMethod(class, originalSelector);//得到实例方法     Method swizzledMethod class_getInstanceMethod(class, swizzledSelector);     BOOL didSwizzleMethod class_addMethod(class, originalSelector, method_getImplementation(swizzledMethod), method_getTypeEncoding(swizzledMethod));     if (didSwizzleMethod) {         class_replaceMethod(class, swizzledSelector, method_getImplementation(originalMethod), method_getTypeEncoding(originalMethod));     } else {         method_exchangeImplementations(originalMethod, swizzledMethod);     } }    转载于:https://www.cnblogs.com/HughLiu/p/4648105.html
http://www.pierceye.com/news/481320/

相关文章:

  • 免费推广网站大全下载c 视频播放网站开发
  • 做外贸网站维护费是多少做瞹瞹嗳视频网站
  • 国外好的网站空间台州论坛
  • 网络网站推广优化wordpress 文章 样式
  • 建设电影网站视频做暧视频网站大全
  • 深圳市建设银行网站国内产品网站
  • 东莞网站建设管理sem网络推广公司
  • seo建站平台哪家好做qq空间网站
  • 网站制作性价比哪家好中国最大的家装网站
  • 网站域名被注册公司运营管理方案
  • 网站建设评语商城微发布官网
  • 仿同程网 连锁酒店 网站模板系统模板html
  • 推广网app下载seo课程
  • 有效方法的小企业网站建设域名怎么拿来做网站
  • 网站版面如何布局做一个企业的网站怎么做的
  • 天门市城市建设管理局网站大连专业网页设计
  • 百度网站收录提交入口全攻略网站支付体现功能怎么做
  • 网站更改文章标题主流跨境电商平台有哪些
  • vue做直播网站上海最繁华的五个区
  • 做网站和微信小程序电子商务网站建设与管理的背景
  • 做网站国内阿里云虚拟主机多少钱东莞常平中学高中部
  • 用.net做购物网站灵山建设局网站
  • 烟台网站设计制作公司电话python购物网站开发流程
  • 医疗网站怎么做seo怎样通过网址浏览自己做的网站
  • 湖北现代城市建设集团网站wordpress用户头像插件
  • 徐州双语网站制作响应式网站开发pdf
  • 怎么做建设网站公司创建一个网站多少钱
  • 好看的扁平化网站wordpress插件编写
  • 深圳网站设计模板ps可以做网站动态图
  • 微信网站制作入门网站开发实施方案进度