2012-08-02 34 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來獲取和更改你的私有變量。也許你可以在你的私有變量之間建立很多關係,如果其他變化,他們會得到錯誤的答案,也許它可以阻止其他人更改你的私有變量