ios - 使用隐藏属性与私有(private) iVars

标签 ios objective-c properties ivar

这个问题特别关注静态库/框架;换句话说,其他人最终会接触到的代码。

我相当精通属性,因为我是在 iOS 6 发布时开始 iOS 开发的。我已经使用在接口(interface)扩展中声明的隐藏属性来完成我所有的“私有(private)”属性工作,包括在我不希望其他人修改的面向公众的属性上使用 readonlyreadwrite 在界面扩展中。

重要的是,我希望其他使用这些静态库/框架的人在我不允许的情况下访问这些属性,或者在我允许的情况下编写这些属性阅读它。

我早就知道他们理论上可以创建自己的接口(interface)扩展并让我的readonly属性自己readwrite,或者猜测隐藏属性的名称。

如果我想避免这种情况,我是否应该使用带有 @private 标签的 ivars 和直接声明的 ivars?这样做有潜在的失败吗?它是否真的为我提供了额外的安全措施,还是转移注意力?

最佳答案

在 ARC 下,属性而非实例变量支持的唯一模式是 copy - 因此如果您需要 copy,请使用属性。

如果您在@implementation 部分声明您的私有(private)实例变量:

@implementation MyClass
{
   // private instance vars
}

然后需要付出很大的努力才能从类外访问它们。正如您所说,访问“私有(private)”属性只需猜测其名称 - 或者使用告诉您的库调用。

为了安全值得吗? YMMV。但无论如何,这是一个很好的编码实践。

附录

正如评论线索所示,关于我使用认真努力的讨论很多。

首先让我们明确一点:Objective-C 属于 C 语言家族,它们都允许程序员在语言的同时做他们选择的任何事情[*] - 这些不是如果您想要在您的代码中实现强类型、访问限制等,可选择的语言。

其次,“努力”不是绝对的衡量标准!所以也许我应该选择“显而易见”这个词来形容它而不是“严重”。要访问私有(private)属性,只需要使用标准方法调用,其中对象的类型为 id - 代码中几乎没有线索表明被调用的方法是隐藏的。要访问私有(private)变量,需要 API 调用(运行时函数或 KVC 调用)或一些指针操作——结果代码看起来与标准变量赋值完全不同。所以它更明显

也就是说,除了需要copy 的使用之外,在ARC 下,当私有(private)实例变量可以使用时,没有充分的理由使用私有(private)属性。对于私有(private)变量 fred 比较:

self.fred = 42;   // property access, may involve a call (if not optimised out)
_fred = 42;       // common way to bypass the accessors and get at the underlying var
fred = 42;        // direct access

选择你的选择,没有正确的答案,但也没有错误的 - 这是意见的领域(这当然是一个意见 ;-))。我经常会选择最后一个,私有(private)变量——干净简单。然而,@RobNapier 在他的回答中更喜欢使用属性。


[*] 注意:一旦您考虑链接到外部代码,比如说用汇编程序编写的,所有的赌注都是任何语言。到那时,您必须查看“硬件”(真实的或虚拟的)和/或“操作系统”以提供保护。

关于ios - 使用隐藏属性与私有(private) iVars,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20670196/

相关文章:

ios - 将导入的类设置为委托(delegate)

ios - 我们可以在没有付费帐户的情况下在 iPhone 上部署应用程序吗

ios - 如何保护数组字段,以便 Parse 用户可以添加对象而不允许恶意更改?

iOS 9 模拟器不工作

python - 自动更新Python类属性的最佳方法

javascript - 在 React 组件之间共享属性

java - 使用@PropertySource配置Spring属性

iphone - 推送通知无法在一个ipod中工作,其余的设备iphone-4,iphone-3,ipod都可以正常工作

ios - ipad 纵向和横向 UI 的差异

ios - iPhone 和 iPad 之间的不同行为