Ios 分类属性

Ios 分类属性,ios,objective-c,objective-c-category,Ios,Objective C,Objective C Category,为什么在既不合成属性也不合成其访问器方法的情况下,允许在类别中声明属性?是否涉及性能开销 分类纯粹是一种编译技术吗 我试图理解分类是如何工作的。只是解释做什么和不做什么。有没有更详细的消息来源 编辑:我知道我可以使用关联的引用。这不是我想要的。我想知道为什么这些属性没有被合成?如果编译器合成它们,是否存在性能问题或安全问题?如果有,我想知道什么和如何做?在分类之前,请重新考虑Obj-C中的属性概念:属性是抽象意义上的东西,可以使用访问器进行写入和读取。通常,有一个实例变量分配给它,但没有必要这样

为什么在既不合成属性也不合成其访问器方法的情况下,允许在类别中声明属性?是否涉及性能开销

分类纯粹是一种编译技术吗

我试图理解分类是如何工作的。只是解释做什么和不做什么。有没有更详细的消息来源


编辑:我知道我可以使用关联的引用。这不是我想要的。我想知道为什么这些属性没有被合成?如果编译器合成它们,是否存在性能问题或安全问题?如果有,我想知道什么和如何做?

在分类之前,请重新考虑Obj-C中的属性概念:属性是抽象意义上的东西,可以使用访问器进行写入和读取。通常,有一个实例变量分配给它,但没有必要这样做。 属性也可能有用,例如,以一致的方式设置多个不同的实例变量,或读取多个变量或进行一些计算

这里的关键事实是:不需要为属性指定实例变量

类别用作对象行为的扩展,即在不更改数据的情况下扩展其方法集。如果您看到抽象意义上的属性,那么它会添加访问器,因此它符合类别的概念。 但是如果你综合它,就会产生一个实例变量,这与类别的概念相矛盾


因此,类别中的属性只有在以不常见、抽象的方式使用时才有意义,
@synthesis
是为了简化普通方式。

在进入类别之前,请重新考虑Obj-C中属性的概念:属性是可以使用访问器在抽象意义上写入和读取的东西。通常,有一个实例变量分配给它,但没有必要这样做。 属性也可能有用,例如,以一致的方式设置多个不同的实例变量,或读取多个变量或进行一些计算

这里的关键事实是:不需要为属性指定实例变量

类别用作对象行为的扩展,即在不更改数据的情况下扩展其方法集。如果您看到抽象意义上的属性,那么它会添加访问器,因此它符合类别的概念。 但是如果你综合它,就会产生一个实例变量,这与类别的概念相矛盾

因此,类别中的属性只有在以不常见的抽象方式使用时才有意义,
@synthesis
是为了简化普通方式。

您可能想了解如何在类别中实现属性存储

引用文章中的话:“为什么这很有用?它允许开发人员向类别中的现有类添加自定义属性,这是Objective-C的一个显著缺点。”

您可能想了解如何在类别中实现属性存储


引用文章中的话:“为什么这很有用?它允许开发人员向类别中的现有类添加自定义属性,这是Objective-C的一个显著缺点。”

@synthesis
通知编译器继续并为setter和getter提供默认实现

所说的默认setter/getter依赖于对象内部某种存储的存在

类别不提供任何额外的存储,因此默认的setter/getter将没有存储或读取的位置

另一种方法是使用:

@dynamic

然后为上述属性提供您自己的实现和存储

一种方法是使用关联对象。 另一种方法是存储/读取一些完全不相关的地方,例如一些可访问的NSUserDefaults字典或


在某些情况下,对于只读属性,您还可以在运行时重构/计算它们的值,而无需存储它们。

@synthesis
通知编译器继续并为setter和getter提供默认实现

所说的默认setter/getter依赖于对象内部某种存储的存在

类别不提供任何额外的存储,因此默认的setter/getter将没有存储或读取的位置

另一种方法是使用:

@dynamic

然后为上述属性提供您自己的实现和存储

一种方法是使用关联对象。 另一种方法是存储/读取一些完全不相关的地方,例如一些可访问的NSUserDefaults字典或

在某些情况下,对于只读属性,您还可以在运行时重构/计算它们的值,而无需存储它们

为什么允许在类别[…]中声明属性

属性有很多方面(在编译和运行时)

  • 它们总是在类上声明一个或两个访问器方法
  • 当编译器将点符号转换为消息时,它们可以更改选择器
  • 结合@synthesis指令(或默认情况下),它们可以使编译器合成访问器方法和可选的IVAR
  • 它们向类中添加在运行时可用的内省信息
  • 当在类别(或协议)中声明属性而合成不可用时,这些方面中的大多数仍然有用

    分类纯粹是一种编译技术吗

    不会。类别作为属性,既有编译时方面,也有运行时方面

    例如,类别可以稍后从动态库加载。因此,可能已经存在突然添加新方法的类实例。这是类别无法添加IVAR和bec的原因之一