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) |
复制关联对象,且为原子操作 |