- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
有几种情况您可能会覆盖父类(super class)的属性。
你声明了一个与它的名称和属性相同的属性父类(super class)'。(因为如果你改变属性你可以获得一个编译器警告)。你可以合成使用您创建的伊娃。什么是这个的用途?或者有什么危害可以吗?
如果父类(super class)在类扩展(类没有名字),那么它可能不是在头文件中。如果你不从标题中知道该属性文件,你可以声明相同的名称具有任何属性或你想要的类(class)。但是setter/getter 方法将覆盖那个“ secret 属性(property)”的那些。我认为这只会造成伤害。但因为你不知道标题文件,你怎么能避免这种情况?
您可以在头文件中将属性声明为“只读”,而在类扩展重新声明为“读写”。我认为这是它可以做好事的情况。
我对这些情况的理解对吗?而且我不知道第一种情况和第二种情况能有什么好处。但是如果我想避免第一种情况,我可以在声明之前检查子类是否已经拥有该属性。但是如果属性不在公共(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/
你能比较一下属性吗 我想禁用文本框“txtName”。有两种方式 使用javascript,txtName.disabled = true 使用 ASP.NET, 哪种方法更好,为什么? 最佳答案 我
Count 属性 返回一个集合或 Dictionary 对象包含的项目数。只读。 object.Count object 可以是“应用于”列表中列出的任何集合或对
CompareMode 属性 设置并返回在 Dictionary 对象中比较字符串关键字的比较模式。 object.CompareMode[ = compare] 参数
Column 属性 只读属性,返回 TextStream 文件中当前字符位置的列号。 object.Column object 通常是 TextStream 对象的名称。
AvailableSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。 object.AvailableSpace object 应为 Drive 
Attributes 属性 设置或返回文件或文件夹的属性。可读写或只读(与属性有关)。 object.Attributes [= newattributes] 参数 object
AtEndOfStream 属性 如果文件指针位于 TextStream 文件末,则返回 True;否则如果不为只读则返回 False。 object.A
AtEndOfLine 属性 TextStream 文件中,如果文件指针指向行末标记,就返回 True;否则如果不是只读则返回 False。 object.AtEn
RootFolder 属性 返回一个 Folder 对象,表示指定驱动器的根文件夹。只读。 object.RootFolder object 应为 Dr
Path 属性 返回指定文件、文件夹或驱动器的路径。 object.Path object 应为 File、Folder 或 Drive 对象的名称。 说明 对于驱动器,路径不包含根目录。
ParentFolder 属性 返回指定文件或文件夹的父文件夹。只读。 object.ParentFolder object 应为 File 或 Folder 对象的名称。 说明 以下代码
Name 属性 设置或返回指定的文件或文件夹的名称。可读写。 object.Name [= newname] 参数 object 必选项。应为 File 或&
Line 属性 只读属性,返回 TextStream 文件中的当前行号。 object.Line object 通常是 TextStream 对象的名称。 说明 文件刚
Key 属性 在 Dictionary 对象中设置 key。 object.Key(key) = newkey 参数 object 必选项。通常是 Dictionary 
Item 属性 设置或返回 Dictionary 对象中指定的 key 对应的 item,或返回集合中基于指定的 key 的&
IsRootFolder 属性 如果指定的文件夹是根文件夹,返回 True;否则返回 False。 object.IsRootFolder object 应为&n
IsReady 属性 如果指定的驱动器就绪,返回 True;否则返回 False。 object.IsReady object 应为 Drive&nbs
FreeSpace 属性 返回指定的驱动器或网络共享对于用户的可用空间大小。只读。 object.FreeSpace object 应为 Drive 对象的名称。
FileSystem 属性 返回指定的驱动器使用的文件系统的类型。 object.FileSystem object 应为 Drive 对象的名称。 说明 可
Files 属性 返回由指定文件夹中所有 File 对象(包括隐藏文件和系统文件)组成的 Files 集合。 object.Files object&n
我是一名优秀的程序员,十分优秀!