首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用隐藏属性与私有iVars

使用隐藏属性与私有iVars
EN

Stack Overflow用户
提问于 2013-12-18 22:54:36
回答 2查看 304关注 0票数 2

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

我对属性相当熟悉,因为我在iOS 6发布时就开始了iOS开发。我使用了在接口扩展中声明的隐藏属性来完成我所有的“私有”属性工作,包括在面向公共的属性上使用readonly --我不希望其他人在接口扩展中修改和使用readwrite

重要的是,我不希望使用这些静态库/框架的其他人访问这些属性(如果我不允许的话),如果我让他们阅读这些属性,也不希望他们编写这些属性。

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

如果我想防止这种情况,我是否应该使用带直接声明的ivars的@private标记的ivars?这样做有潜在的失败吗?它真的给我带来了额外的安全措施,还是一条红鲱鱼?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-12-19 01:38:27

您应该在这里使用私有(“隐藏”)属性。没有“安全”风险。此场景中的“攻击者”是调用者。调用方可以完全访问进程中的所有内存。她可以访问您的框架中她想要的任何东西,您绝对无法阻止它(您也不应该)。这在任何语言中都是正确的。如果您知道自己在做什么,也可以绕过C++中的“私有:”指定。这只是一天结束时的记忆。

保护自己或框架不受调用者影响并不是您的职责。你们都有相同的目标:正确的程序行为。你的目标是保护来电者不受自己的伤害。让他们很难不正确地使用您的框架,并且很容易正确地使用它。

因此,您应该使用导致最正确的代码的工具。该工具是属性,除了init和dealloc之外,还避免直接访问ivar。

票数 2
EN

Stack Overflow用户

发布于 2013-12-18 23:12:53

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

如果在@implementation部分中声明私有实例变量:

代码语言:javascript
复制
@implementation MyClass
{
   // private instance vars
}

然后,需要认真的努力才能从课堂之外访问它们。正如您所说,访问“私有”属性只需猜测其名称--或者使用告诉您的库调用。

为了安全起见值得吗?YMMV但不管怎么说,这是一种很好的编码实践。

增编

正如评论中所显示的,对于我认真努力的使用,已经有了很多的讨论。

首先,让我们明确一点:目标C是C语言家族中的语言,它们都允许程序员在语言中使用他们所选择的任何语言*如果您想要在代码中进行强大的输入、访问限制等,这些语言都不是首选语言。

第二,“努力”不是绝对的尺度!所以也许我应该选择“显而易见”这个词来限定它,而不是“严肃的”。要访问私有属性,只需要使用一个标准的方法调用,其中对象的类型为id --在代码中几乎没有提示被调用的方法是隐藏的。要访问私有变量,要么需要API调用(运行时函数或KVC调用),要么需要一些指针操作--结果代码看起来一点也不像标准变量赋值。所以更明显的是。

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

代码语言:javascript
复制
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

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

*注:一旦你考虑连接到外部代码,比如说用汇编语言写的,所有的赌注都是用任何语言写的。此时,您必须查看“硬件”(真实的或虚拟的)和/或"OS“才能提供保护。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20670196

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档