面试常见问题iOS基础

iOS开发 Category

2021-04-29  本文已影响0人  喜剧收尾_XWX

1.说下category原理,以及category为什么只能添加方法不能添加属性?

struct category_t {
    const char *name;
    classref_t cls;
    struct method_list_t *instanceMethods; // 对象方法
    struct method_list_t *classMethods; // 类方法
    struct protocol_list_t *protocols; // 协议
    struct property_list_t *instanceProperties; // 属性
    // Fields below this point are not always present on disk.
    struct property_list_t *_classProperties;

    method_list_t *methodsForMeta(bool isMeta) {
        if (isMeta) return classMethods;
        else return instanceMethods;
    }

    property_list_t *propertiesForMeta(bool isMeta, struct header_info *hi);
};

2.load 和 initialize的区别

(1)调用时机:

(2)调用顺序:

(3)调用方式

(4)实际使用

3.分类和扩展之间的区别

(1)Category

(2)Extension

(3)区别

4.多个分类中都有相同的方法名,执行那个分类?

5.如何给category添加属性

(1)方式一

1在.h中
@property(nonatomic,copy)NSString *name;
2在.m中
static NSString *_name;
-(void)setName:(NSString *)name
{
    _name = name;
}
-(NSString *)name
{
    return _name;
}

缺点:_name静态全局变量与类并没有关联,无论对象创建与销毁,只要程序在运行_name变量就存在,并不是真正意义上的属性。

(1)方式二

1在.h中
@property(nonatomic,copy)NSString *age;
2在.m中
-(void)setAge:(NSString *)age{
    //参数一:给那个对象添加属性
    //参数二:属性名
    //参数三:关联的值,也就是set方法存入值给属性去保存
    //策略
    objc_setAssociatedObject(self, @"age",age, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
-(NSString *)age
{
    return objc_getAssociatedObject(self, @"age");
}

6.给分类关联对象实现原理

上一篇 下一篇

猜你喜欢

热点阅读