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字典或
在某些情况下,对于只读属性,您还可以在运行时重构/计算它们的值,而无需存储它们
为什么允许在类别[…]中声明属性
属性有很多方面(在编译和运行时)