OC中类别(Category)的属性

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了OC中类别(Category)的属性相关的知识,希望对你有一定的参考价值。

参考技术A 原则上来说类别(分类)中只可以添加方法,不可以添加属性和成员变量(只是理论上不能添加属性,实际上是可以通过RunTime机制来添加的)。
如下所示,类别也可以和类一样通过 @property 来添加属性,但是一般情况下不要这么做,因为如果直接和类一样来通过 @property 来添加属性的话,编译和运行都不会报错,但是一旦程序中有地方通过 self.deviceName 或 _deviceName 的形式来访问属性或变量就会报错,因为类别的结构体指针中没有属性列表,所以类别中用 @property 是不会生成带下划线的成员变量的,也不会生成setter/getter方法,所以编译或运行时因为找不到setter或getter方法而报错。

但在一些特殊情况下我们可以在类别中通过 @property 来添加属性后手动在.m文件中实现setter和getter方法。如下所示是一个UIView的分类,通过 @property 添加了一个x的属性,手动实现的setter/getter方法其实并不是直接设置的x或获取的x的值。或者可以通过runtime机制来添加属性。

需要注意的是,由于类别不能通过常规方法添加成员变量,所以下面这种写法是会报错的。

Category基本概念

1.什么是Category

  • Category有很多种翻译: 分类 \\ 类别 \\ 类目 (一般叫分类)

  • Category是OC特有的语法, 其他语言没有的语法

  • Category的作用

    • 可以在不修改原来类的基础上, 为这个类扩充一些方法
    • 一个庞大的类可以分模块开发
    • 一个庞大的类可以由多个人来编写,更有利于团队合作

2.Category的格式

  • 在.h文件中声明类别

    • 1)新添加的方法必须写在 @interface 与 @end之间
    • 2)ClassName 现有类的类名(要为哪个类扩展方法)
    • 3)CategoryName 待声明的类别名称
    • 4)NewMethod 新添加的方法
@interface ClassName (CategoryName)
NewMethod; //在类别中添加方法
//不允许在类别中添加变量
@end

    注意: 1)不允许在声明类别的时候定义变量

  • 在.m文件中实现类别:

  1)新方法的实现必须写在@ implementation与@end之间

  2)ClassName 现有类的类名

  3)CategoryName 待声明的类别名称

  4)NewMethod 新添加的方法的实现

@implementation ClassName(CategoryName)

NewMethod
... ...
@end
  • 使用Xcode创建分类

 

以上是关于OC中类别(Category)的属性的主要内容,如果未能解决你的问题,请参考以下文章

OC中的类别Category-协议Protocol-… - 韩俊强的博客 - 博客频道 - CSDN.NET

OC中类别扩展协议与委托

iOS的Runtime机制下给类别(category)添加属性替换原有类的方法执行

OC category如何注入新的属性(property)

获取活动页面的当前类别 ID

OC基础回想类别