iOS Category

Category是类别,也叫类目,

在 Objective-C 中可以通过 Category 给一个现有的类添加属性,但是却不能添加实例变量

 

类别中只能添加方法,不能添加实例变量

 

我的类目添加了一下内容  这里的两个看似是属性的声明   是必须要实现setter 和 getter 方法的  而且也是不占内存的  如果不实现这两个方法调用时 runtime就找不到getter and setter methods当然会崩溃啦。 归根揭底 这样其实也是添加了方法。所以  类别中只能添加方法

@interface UIView(Basic)

@property (nonatomic) CGFloat current_x;

@property (nonatomic) CGFloat current_y;

.m文件

- (CGFloat)current_x

{

    return self.frame.origin.x;

}

 

- (void)setCurrent_x:(CGFloat)current_x {

    CGRect frame = self.frame;

 

    frame.origin.x = current_x;

    self.frame = frame;

}

但是有时候我们需要去给一些类加属性的话  我们可以通过关联Associated Objects 来实现。

tatic const char *badgeViewKey = "badgeViewKey";

@implementation AppDelegate (im)

- (void)setBadgeView:(UIImageView *)badgeView

{

    objc_setAssociatedObject(self, badgeViewKey, badgeView, OBJC_ASSOCIATION_RETAIN_NONATOMIC);

}

- (UIImageView *)badgeView

{

    return objc_getAssociatedObject(self, badgeViewKey);

}

以下摘自  http://www.cnblogs.com/Ohero/p/4739089.html

  从上面的两种实现关联对象的方法中,我们使用了两种不同的key值

  1. static void *kAssociatedObjectKey = &kAssociatedObjectKey;
  2. 用 selector ,使用 getter 方法的名称作为 key 值。

  3. 其实还有一种 static char kAssociatedObjectKey;      objc_getAssociatedObject(self, &kAssociatedObjectKey);

  对比这三种方式,很多人都喜欢第二种

关联策略

等价属性

说明

OBJC_ASSOCIATION_ASSIGN

@property (assign) or @property (unsafe_unretained)

弱引用关联对象

OBJC_ASSOCIATION_RETAIN_NONATOMIC

@property (strong, nonatomic)

强引用关联对象,且为非原子操作

OBJC_ASSOCIATION_COPY_NONATOMIC

@property (copy, nonatomic)

复制关联对象,且为非原子操作

OBJC_ASSOCIATION_RETAIN

@property (strong, atomic)

强引用关联对象,且为原子操作

OBJC_ASSOCIATION_COPY

@property (copy, atomic)

复制关联对象,且为原子操作

  1. 关联对象与被关联对象本身的存储并没有直接的关系,它是存储在单独的哈希表中的;
  2. 关联对象的五种关联策略与属性的限定符非常类似,在绝大多数情况下,我们都会使用 OBJC_ASSOCIATION_RETAIN_NONATOMIC 的关联策略,这可以保证我们持有关联对象;
  3. 关联对象的释放时机与移除时机并不总是一致,比如实验中用关联策略 OBJC_ASSOCIATION_ASSIGN 进行关联的对象,很早就已经被释放了,但是并没有被移除,而再使用这个关联对象时就会造成 Crash 。

 

posted on 2017-10-31 17:13  巧笑倩兮,美目盼兮  阅读(122)  评论(0编辑  收藏  举报