美文网首页
OC底层运行时关联理解

OC底层运行时关联理解

作者: 行走的菜谱 | 来源:发表于2016-03-04 17:09 被阅读102次

    UIAlertView的扩展

    .h文件

    import <UIKit/UIKit.h>

    typedef void (^successBlock)(NSInteger buttonIndex);
    @interface UIAlertView (Block)<UIAlertViewDelegate>

    • (void)showWithBlock:(successBlock)block;@end

    .m文件

    import "UIAlertView+Block.h"

    import <objc/runtime.h>

    static const char alertKey;
    @implementation UIAlertView (Block)

    • (void)showWithBlock:(successBlock)block{
      if (block) {
      objc_setAssociatedObject(self, &alertKey, block,OBJC_ASSOCIATION_RETAIN_NONATOMIC);
      self.delegate = self;
      }
      [self show];
      }
    • (void)alertView:(UIAlertView *)alertView clickedButtonAtIndex:(NSInteger)buttonIndex {
      successBlock block = objc_getAssociatedObject(self, &alertKey); block(buttonIndex);
      }
      @end

    UIButton的扩展

    .h文件

    import <UIKit/UIKit.h>

    typedef void (^btnBlock)();
    @interface UIButton (Block)

    • (void)handelWithBlock:(btnBlock)block;
      @end

    .m文件

    import "UIButton+Block.h"

    import <objc/runtime.h>

    static const char btnKey;
    @implementation UIButton (Block)

    • (void)handelWithBlock:(btnBlock)block{
      if (block) {
      objc_setAssociatedObject(self, &btnKey, block, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
      }
      [self addTarget:self action:@selector(btnAction) forControlEvents:UIControlEventTouchUpInside];
      }
    • (void)btnAction{
      btnBlock block = objc_getAssociatedObject(self, &btnKey);
      block();
      }
      @end

    tips: 使用objc_setAssociatedObject,需要引入头文件#import <objc/runtime.h>

    void objc_setAssociatedObject(id object, const void key, id value, objc_AssociationPolicy policy);
    id objc_getAssociatedObject(id object, const void
    key);

    这两个方法可以让一个对象和另一个对象关联,就是说一个对象可以保持对另一个对象的引用,并获取那个对象。有了这些,就能实现属性功能了。 policy可以设置为以下这些值:
    enum {
    OBJC_ASSOCIATION_ASSIGN = 0,
    OBJC_ASSOCIATION_RETAIN_NONATOMIC = 1,
    OBJC_ASSOCIATION_COPY_NONATOMIC = 3,
    OBJC_ASSOCIATION_RETAIN = 01
    OBJC_ASSOCIATION_COPY = 01403};

    相关文章

      网友评论

          本文标题:OC底层运行时关联理解

          本文链接:https://www.haomeiwen.com/subject/mfmokttx.html