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值
- static void *kAssociatedObjectKey = &kAssociatedObjectKey;
-
用 selector ,使用 getter 方法的名称作为 key 值。
- 其实还有一种 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) |
复制关联对象,且为原子操作 |
- 关联对象与被关联对象本身的存储并没有直接的关系,它是存储在单独的哈希表中的;
- 关联对象的五种关联策略与属性的限定符非常类似,在绝大多数情况下,我们都会使用 OBJC_ASSOCIATION_RETAIN_NONATOMIC 的关联策略,这可以保证我们持有关联对象;
- 关联对象的释放时机与移除时机并不总是一致,比如实验中用关联策略 OBJC_ASSOCIATION_ASSIGN 进行关联的对象,很早就已经被释放了,但是并没有被移除,而再使用这个关联对象时就会造成 Crash 。