2012-04-13 51 views
2

確定基本上,我在iPhone應用程序中有一個類,我希望它只讀一些propertys。這意味着擁有的類可以讀取和寫入屬性,但其他對象只能讀取它。當我聲明屬性時,我嘗試「只讀」選項,但是我的班級甚至無法寫入它。那有什麼用處?在iOS中創建iPhone屬性只讀objective-c

回答

3

如果不是太不方便,只需在你的類中使用ivar或「backing」變量來修改該值。就像這樣:

在您的.h文件中:

@interface ClassName 

@property (readonly,nonatomic) NSInteger readOnlyValue; 

@end 

在您.m文件:

@implementation ClassName 

@synthesize readOnlyValue = _readOnlyValue; 



_readOnlyValue = 42; 

@end 
+0

我會試試看。謝謝。 – 2012-04-13 21:41:23

+0

這是簡化的,因爲你使用原始類型。如果readOnlyValue將是一個Object,例如UILabel,那麼保留版本呢? – AlexWien 2012-12-01 16:03:33

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,但更好的解決方案通常是使用類擴展。它們的設計正好是爲了解決這個問題,通過使用它們,您可以稍後重構代碼,以便將@propertyreadwrite定義暴露給應用中的其他類,而不會將其暴露給所有類。

前段時間我寫了一個detailed explanation

6

我們假設您想在的類中創建一個名爲foo的屬性int

執行此操作界面中的任何文件(.h):

@property(readonly) int foo; 

然後在你的實現(.M)文件,建立一個類擴展,你可以重新定義你的財產。

@interface YourClass() 

@property(readwrite) int foo; 

@end 

這將導致財產被readonly公開,但私下裏readwrite

然後,當然,你在下面的實現中合成foo

@synthesize foo;