確定基本上,我在iPhone應用程序中有一個類,我希望它只讀一些propertys。這意味着擁有的類可以讀取和寫入屬性,但其他對象只能讀取它。當我聲明屬性時,我嘗試「只讀」選項,但是我的班級甚至無法寫入它。那有什麼用處?在iOS中創建iPhone屬性只讀objective-c
2
A
回答
3
如果不是太不方便,只需在你的類中使用ivar或「backing」變量來修改該值。就像這樣:
在您的.h文件中:
@interface ClassName
@property (readonly,nonatomic) NSInteger readOnlyValue;
@end
在您.m文件:
@implementation ClassName
@synthesize readOnlyValue = _readOnlyValue;
_readOnlyValue = 42;
@end
0
你可以在.m類中實現你自己的setter或者synteshize爲: foo = _foo;所以你可以在內部調用_foo(私有變量)
0
在進一步思考,實現這一目標的最簡單的方法是添加一個正常的財產一個類擴展,然後在頭中聲明一個getter。例如。
接口:
@interface MyClass: NSObject
- (NSString *)someString;
@end
實現:
@interface MyClass()
@property (nonatomic, retain) NSString *someString;
@end
@implementation MyClass
@synthesize someString;
@end
您可以獲取和設置,使用點符號或其他方式,並直接在類內訪問someString
實例變量,和每個看過界面的人都可以使用點符號或其他方式獲得。
2
雖然你可以像其他答案中描述的那樣去直接訪問iVar,但更好的解決方案通常是使用類擴展。它們的設計正好是爲了解決這個問題,通過使用它們,您可以稍後重構代碼,以便將@property
的readwrite
定義暴露給應用中的其他類,而不會將其暴露給所有類。
前段時間我寫了一個detailed explanation。
6
我們假設您想在的類中創建一個名爲foo
的屬性int
。
執行此操作界面中的任何文件(.h):
@property(readonly) int foo;
然後在你的實現(.M)文件,建立一個類擴展,你可以重新定義你的財產。
@interface YourClass()
@property(readwrite) int foo;
@end
這將導致財產被readonly
公開,但私下裏readwrite
。
然後,當然,你在下面的實現中合成foo
。
@synthesize foo;
相關問題
- 1. 如何創建只讀屬性
- 2. 在cocos2d中創建指針屬性iPhone
- 3. 如何在C#中創建只讀對象屬性?
- 4. 如何在Ruby模型中創建只讀虛擬屬性
- 5. 在Python中創建一個類實例屬性只讀
- 6. 只讀屬性
- 7. 只讀屬性
- 8. 創建多個只讀屬性動態地在AS3
- 9. 在C#創建目錄,而不只讀屬性
- 10. PHP中的只讀屬性?
- 11. 只讀屬性,在C#6.0
- 12. 只讀屬性在MVC 4
- 13. Threadsafe只讀屬性
- 14. OData只讀屬性
- 15. ScriptControlDescriptor.AddProperty&只讀屬性
- 16. 只讀VS自動(只讀)屬性
- 17. 在派生類中使屬性只讀
- 18. 在JavaScript中定義只讀屬性
- 19. 如何創建只讀依賴項屬性?
- 20. JAXB可以創建「只讀」類屬性嗎?
- 21. 創建具有幾個只讀屬性的類的實例
- 22. 導軌 - 汽車只能生成讀取屬性上創建
- 23. 我可以創建一個只讀的依賴項屬性嗎?
- 24. 爲iPhone項目創建屬性
- 25. 創建屬性在Java中
- 26. 在sysfs中創建屬性
- 27. 如何在iOS中創建只讀電子郵件?
- 28. 有沒有更好的方法在rails中創建只讀屬性?
- 29. 在WinRT中創建只讀依賴項屬性的最佳方法是什麼?
- 30. 在PropertyGrid中動態設置屬性的只讀屬性
我會試試看。謝謝。 – 2012-04-13 21:41:23
這是簡化的,因爲你使用原始類型。如果readOnlyValue將是一個Object,例如UILabel,那麼保留版本呢? – AlexWien 2012-12-01 16:03:33