gpt4 book ai didi

objective-c - Objective-C 中属性覆盖的危害是什么?

转载 作者:太空狗 更新时间:2023-10-30 03:15:10 32 4
gpt4 key购买 nike

有几种情况您可能会覆盖父类(super class)的属性。

  1. 你声明了一个与它的名称和属性相同的属性父类(super class)'。(因为如果你改变属性你可以获得一个编译器警告)。你可以合成使用您创建的伊娃。什么是这个的用途?或者有什么危害可以吗?

  2. 如果父类(super class)在类扩展(类没有名字),那么它可能不是在头文件中。如果你不从标题中知道该属性文件,你可以声明相同的名称具有任何属性或你想要的类(class)。但是setter/getter 方法将覆盖那个“ secret 属性(property)”的那些。我认为这只会造成伤害。但因为你不知道标题文件,你怎么能避免这种情况?

  3. 您可以在头文件中将属性声明为“只读”,而在类扩展重新声明为“读写”。我认为这是它可以做好事的情况。

我对这些情况的理解对吗?而且我不知道第一种情况和第二种情况能有什么好处。但是如果我想避免第一种情况,我可以在声明之前检查子类是否已经拥有该属性。但是如果属性不在公共(public)头文件中,如第二种情况,我就不知道该怎么办了。

最佳答案

您提到的每种情况都有一个合适的位置,在野外的使用频率各不相同。你只需要小心不要踩到自己。我将用我个人遇到的例子来说明。

子类化以有意覆盖属性
在这种情况下,就像 Joe 提到的那样,您最好确切地知道自己在做什么,并且在覆盖属性之前没有其他选择。我个人发现通常覆盖一个已经存在的属性的单个 setter 或 getter 来实现定制就足够了,而不是重新声明和合成属性。例如,考虑一个专门的 UIView 子类,它只有具有 UIClearColor 背景才有意义。要强制执行此操作,您可以覆盖 -setBackgroundColor: 以仅打印一条警告消息,然后不调用 super 的实现。我会说我从来没有理由完全覆盖一个属性,但我不会说它在某些情况下你需要完全劫持现有属性时不是一个有用的工具。

私有(private)属性(property)
这比您认为的更有用。私有(private)属性(property)的替代品是我们都熟悉的普通 ol'ivar。如果这是一个以某种频率变化的 ivar,您最终会得到如下所示的代码块:

[_myIvar release], _myIvar = nil;

或:

[_myIvar release];
_myIvar = [someValue retain];

虽然看起来还不错,但像这样的内存管理样板代码会变得非常陈旧,速度非常快。或者,我们可以将上述示例实现为具有保留语义的私有(private)属性。这意味着,无论如何,我们只需要:

self.myIvar = someValue;

一段时间后,眼睛和手指就容易多了。您注意到这一点是正确的,因为这个属性对宇宙的其余部分是不可见的,它可能会意外地被子类覆盖。这是在 Objective-C 中开发时固有的风险,但您可以采取措施使风险变得非常小。这些措施是以可预测的方式修改私有(private)属性(property)名称的变体。您可以在这里选择无限的道路:例如,您制定个人政策,在您的私有(private)属性(property)名称前加上您的姓名首字母和下划线。对我来说,我会得到类似 mw_ivar 的东西,以及相应的 -setMW_ivar:-mw_ivar 访问器。是的,根据统计,有人可能会出现并意外覆盖该名称,但实际上,他们不会。特别是如果您有办法将您的实践发布给可能使用您的代码的人。而且,我可以肯定地说,Apple 并没有四处走动并以这种方式制造私有(private)属性(property),所以你在这方面也是安全的。

公开只读,私有(private)读写
这只是标准做法。你是对的,它很有用,而且它并不危险,因为该属性位于标题中。任何人不小心覆盖它只能怪他们自己。

关于objective-c - Objective-C 中属性覆盖的危害是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5650887/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com