2012-08-02 25 views
0

我知道我可以使用@private关键字将我的实例变量声明为private。我相信它只会在编译时被强制执行。如何防止在运行时在目标C中访问私有变量?

你知道有什么方法可以防止其他用户在运行时访问我的私有变量吗?

我在问这是因为我构建了一个静态库,它将分发给其他开发人员,我不希望他们有权访问我的私有变量。

+2

你想阻止什么,具体是什么?这些其他开发者是否以某种方式被认为是敌对的? – 2012-08-02 08:12:41

回答

2

您不能阻止确定的人在运行时混淆数据(一旦他们知道内存中的对象的地址,并且它位于当前进程可自由写入的分配空间中,则总是有办法更改)。你可能做的最好的事情就是混淆它,例如只显示一个void*,在其他地方分配内存并投射。

+0

在C++和Java等其他编译语言中,这也是如此吗? – Trung 2012-08-02 09:13:00

+0

在C++中至少是true。例如,考虑:'class X {private:int i; };'。如果我有'X x;',*编译器*可能不允许我访问'i',但是这是微不足道的;例如我可以声明自己的'struct Y {int i; };''大小相同,并且使用'((Y *)&x) - > i = 3'来设置它*无论如何*。 – 2012-08-03 04:02:59

1

而不是在您的(公共).h文件中使用@private,您可以在.m文件中的类扩展名中声明实例变量。这也不会阻止确定的人访问它,正如@KevinGrant正确地说的,但至少其他人不会看到该声明(并且调试器将不会显示它,我假设)。

增加:参见例如Objective C - Make iVars hidden关于该主题的讨论。

+0

是。我已经隐藏了公共头文件中提及的私有变量。现在我想在运行时保护它。 – Trung 2012-08-02 09:09:16

0

我不认为你可以在运行时阻止其他访问私有变量。因为其他人可以使用KVC和KVO来获取和更改你的私有变量。也许你可以在你的私有变量之间建立很多关系,如果其他变化,他们会得到错误的答案,也许它可以阻止其他人更改你的私有变量