面试题:分类和扩展的区别

分类(Category)

分类的作用是动态的(分类是在运行期决议的)为一个已经存在的类添加方法,即使你不知道这个类的源码。

注意

1.分类中不能为类添加实例变量,如果添加实例变量会直接报错:

 Instance variables may not be placed in categories

因为在运行期,对象的内存布局已经确定,如果添加实例变量就会破坏类的内部布局,这对编译型语言来说是灾难性的。

2.分类中可以使用属性@property,但是只会生成setter、getter方法的声明(不会生成实例变量以及setter、getter方法的实现)。当调用setter、getter方法时,可以编译通过,但是运行时会报错:

unrecognized selector sent to instance

因为setter、getter方法没有实现。
实现方法:
通过建立关联引用的方式,实现setter、getter方法。
3.分类中增加的方法如果与原有类的方法重名,则分类中的方法会覆盖原有类的方法,因为分类的优先级更高。

扩展(Extension)

扩展可以看作是匿名的分类。
扩展可以为一个已经存在的类添加方法和属性。
扩展在编译期决议。扩展一般用来隐藏类的私有信息,你必须有一个类的源码才能为一个类添加扩展。

category 和 extension 的区别

  • 相同点:都可以为一个类添加方法
  • 不同点:Category只能用于添加方法,不能用于添加成员变量。extension中声明的方法和添加的成员变量是私有的,只有主implement能调用,外部的类无法调用。
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 今天在研究swift的时候看到了分类和扩展。这是两个十分重要有用的功能,但是之前用的不多,没有深入了解过,在今天就...
    weicyNO_1阅读 2,939评论 1 3
  • *面试心声:其实这些题本人都没怎么背,但是在上海 两周半 面了大约10家 收到差不多3个offer,总结起来就是把...
    Dove_iOS阅读 27,203评论 30 471
  • 目录 丫头和别人最不一样的地方,就是她晚上特能睡,早上特早醒。所以,第二天一大早,我的两个酒窝又一次惨遭蹂躏。 “...
    lekli阅读 482评论 0 1
  • 1.这个世界充满着惊喜与惊吓! 2.信息是致富的关键。 3.纸上得来终觉浅,绝知此事要躬行。
    Eric小风阅读 153评论 0 0
  • 时文 女儿对色彩的敏感,得益于她从小学画画。她上中班的时候,我就送她去少年宫跟一位美术老师学画画。一天她学画回来,...
    时间yi阅读 694评论 1 4