美文网首页
(二十五)[OC高效系列]勿在分类中声明属性

(二十五)[OC高效系列]勿在分类中声明属性

作者: 修行猿 | 来源:发表于2016-08-20 18:02 被阅读21次

    1.除了主分类,其他分类中声明的属性不会生成实质的成员变量,只会生成对应的setter和getter方法。

    @interface Person (YXInfo)
    @property (nonatomic,copy) NSString *name;
    @end
    
    @implementation Person (YXInfo)
    - (NSString *)name{
        //return _name;  //use of undeclared identifier '_name'
        return nil;
    }
    - (void)setName:(NSString *)name{
        //_name = name; // //use of undeclared identifier '_name'
    }
    @end
    

    2.那么就没有办法在分类中为类加上一个成员变量?Runtime!

    通过(十) [OC高效系列]在既有类中使用关联对象存放自定义数据这篇博文上说的这种形式。

    比如:

    @interface Person (YXInfo)
    @property (nonatomic,copy) NSString *name;
    @end
    static char kyxName;
    @implementation Person (YXInfo)
    - (NSString *)name{
        return objc_getAssociatedObject(self, &kyxName);
    }
    - (void)setName:(NSString *)name{
        objc_setAssociatedObject(self, &kyxName, name, OBJC_ASSOCIATION_COPY);
    }
    @end
    

    但是这样的形式,虽然可行,书中并不推荐,因为要保持属性声明中的内存管理的语义与runtime中传入的语义参数保持一致。

    可以定义存取方法,但是不要使用属性。

    3.有些只读属性还是可以在分类中使用的

    相关文章

      网友评论

          本文标题:(二十五)[OC高效系列]勿在分类中声明属性

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