![]() |
1
42
你不能用
你
可以
用一个类扩展(也就是匿名类)来实现这一点,它只是一个没有名称的类,其方法必须在主目录中实现。
见 the Apple docs on extensions 更多信息。(显然这是Mac OS 10.5中的新功能。) 编辑:示例:
另一个解决方案是使用
|
![]() |
2
12
我找到了一个解释,为什么在类别中禁止合成属性,但你如何能 使用类扩展 而是: 以下信息来自 http://www.friday.com/bbum/2009/09/11/class-extensions-explained/ “在类别中禁止合成的原因是合成需要存储,并且无法有效地声明类别中的存储,因此,不认为允许类别合成方法直接干扰类别的ivar是可以接受的。太脆弱和丑陋。 然而,也显然希望能够声明一个公共只读的属性,但其实现是为了类或框架的内部目的而读写的。 另外一个要求是,这种性质的合成必须始终能够自然、准确地合成setter和getter。具体地说,在将属性声明为原子属性时,开发人员无法仅正确地手动写入getter-setter对的1/2;锁定基础结构没有公开,因此在这种情况下无法保证原子性。 类扩展优雅地解决了这个问题。 具体来说,您可以声明如下属性:
然后,在实现文件中:
最终结果?一种公开只读的属性,但不公开读写,不打开与类别相关的所有有趣的脆弱性的属性。” |
![]() |
3
8
斯科特·史蒂文森( http://theocacao.com/ )在他的博客中解释 "A Quick Objective-C 2.0 Tutorial: Part II" 如何获得 具有私有setter的公共属性 . 按照他的建议,您将获得一个对公众只读的属性,但是有一个私有的setter,它可以与点语法一起使用。希望这有帮助… |
![]() |
4
2
我只想增加我的2美分,让人们知道,可以通过类别(而不是类扩展)向现有类添加属性。它需要使用关联引用,但实际上并没有那么糟糕。 我写了一篇 post about it here 如果有人想了解更多细节的话。 还有一个问题涉及这个主题, but it's pretty scant on the details . 干杯 |
![]() |
5
1
因为类别只能向类中添加方法,所以您无法通过尝试在类别中定义属性方法来绕过这一点。
可以声明从已经存在的类派生的属性。例如。如果你的班级有
但是,你不能
从类设计的角度来看,我不确定私有财产的概念是否有意义:我个人认为私有财产是一个类公开暴露的东西。
你可以用
|
![]() |
6
1
实际上,使用最新的LLVM编译器,这个问题可以更好地解决。先前建议尽可能隐藏属性的方法是在.h中声明变量,在变量前面加上u,在private.m的类扩展中声明属性,并在@implementation中@synthese该属性。 有了最新的LLVM(3.0),您可以走得更远,隐藏您的财产的所有信息,包括支持的IVAR。它的声明可以移动到.m中,甚至可以省略,在这种情况下,编译器将合成它(谢谢Ivan): 汽车:
汽车:
|
![]() |
Martin sku · 在目标C中打印时间 2 年前 |
![]() |
Vinod prajapat · 如何更新数组的最后一个元素? 2 年前 |
![]() |
subin272 · 修复iOS中的多个按钮单击事件? 6 年前 |
![]() |
James Chan · 如何使用锁定/解锁? 6 年前 |
![]() |
Josh F. · NSBundle mainBundle返回零 6 年前 |