这个问题特别关注静态库/框架;换句话说,其他人最终会接触到的代码。
我对属性相当熟悉,因为我在iOS 6发布时就开始了iOS开发。我使用了在接口扩展中声明的隐藏属性来完成我所有的“私有”属性工作,包括在面向公共的属性上使用readonly --我不希望其他人在接口扩展中修改和使用readwrite。
重要的是,我不希望使用这些静态库/框架的其他人访问这些属性(如果我不允许的话),如果我让他们阅读这些属性,也不希望他们编写这些属性。
我已经知道,理论上他们可以创建自己的接口扩展,并让我的readonly属性自己创建readwrite,或者猜测隐藏属性的名称。
如果我想防止这种情况,我是否应该使用带直接声明的ivars的@private标记的ivars?这样做有潜在的失败吗?它真的给我带来了额外的安全措施,还是一条红鲱鱼?
发布于 2013-12-19 01:38:27
您应该在这里使用私有(“隐藏”)属性。没有“安全”风险。此场景中的“攻击者”是调用者。调用方可以完全访问进程中的所有内存。她可以访问您的框架中她想要的任何东西,您绝对无法阻止它(您也不应该)。这在任何语言中都是正确的。如果您知道自己在做什么,也可以绕过C++中的“私有:”指定。这只是一天结束时的记忆。
保护自己或框架不受调用者影响并不是您的职责。你们都有相同的目标:正确的程序行为。你的目标是保护来电者不受自己的伤害。让他们很难不正确地使用您的框架,并且很容易正确地使用它。
因此,您应该使用导致最正确的代码的工具。该工具是属性,除了init和dealloc之外,还避免直接访问ivar。
发布于 2013-12-18 23:12:53
在ARC下,属性(而不是实例变量)支持的唯一模式是copy --因此,如果需要copy,请使用属性。
如果在@implementation部分中声明私有实例变量:
@implementation MyClass
{
// private instance vars
}然后,需要认真的努力才能从课堂之外访问它们。正如您所说,访问“私有”属性只需猜测其名称--或者使用告诉您的库调用。
为了安全起见值得吗?YMMV但不管怎么说,这是一种很好的编码实践。
增编
正如评论中所显示的,对于我认真努力的使用,已经有了很多的讨论。
首先,让我们明确一点:目标C是C语言家族中的语言,它们都允许程序员在语言中使用他们所选择的任何语言*如果您想要在代码中进行强大的输入、访问限制等,这些语言都不是首选语言。
第二,“努力”不是绝对的尺度!所以也许我应该选择“显而易见”这个词来限定它,而不是“严肃的”。要访问私有属性,只需要使用一个标准的方法调用,其中对象的类型为id --在代码中几乎没有提示被调用的方法是隐藏的。要访问私有变量,要么需要API调用(运行时函数或KVC调用),要么需要一些指针操作--结果代码看起来一点也不像标准变量赋值。所以更明显的是。
也就是说,除了需要使用copy之外,在ARC下,当私有实例变量可以使用时,没有充分的理由使用私有属性。对于私有变量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选择吧,没有正确的答案,但也没有错误的答案--这是意见的范围(当然,这是一种意见;-)。我经常会选择最后一个,私人变量-干净和简单。然而,@RobNapier在他的回答中更喜欢使用属性。
*注:一旦你考虑连接到外部代码,比如说用汇编语言写的,所有的赌注都是用任何语言写的。此时,您必须查看“硬件”(真实的或虚拟的)和/或"OS“才能提供保护。
https://stackoverflow.com/questions/20670196
复制相似问题