2010-10-31 71 views
0

我有一個數據模型,Objective-C的變量,它是與此類似:有多個權限

          (in another project) 
________________________________  _______________________ 
|        |  |      | 
| Graph       |  | DetailedGraph   | 
| GraphListener lstnr   |  | (needs to access foo) | 
| NSString foo     | <----|_______________________|  
| ____________________________ | 
| | GraphListener    | |  _______________________ 
| | Graph enclosing   | |  |      | 
| | (also needs to access foo) | |  | OtherClass   | 
| |____________________________| |  | (cannot access foo) | 
|________________________________|  |_______________________| 

現在,我的問題是,GraphListener應該是一個內部類,不能在objc完成,所以我有這樣的解決方案:

@interface Graph_Listener 
{ 
    @private 
    Graph *enclosing; 
} 
@end 

@interface Graph 
{ 
    @package 
    NSString *foo; 
} 
@end 

現在,我的問題是,當我來繼承Graph,並使DetailedGraph類,這是在另一個項目,仍然需要訪問foo,我怎麼能做到(我寧願不使用屬性,因爲變量foo不應在GraphListenerDetailedGraph之外訪問。

回答

1

首先,我希望你的兩個類繼承自NSObject,而不是根類。在iOS上創建Objective-C中的新根目錄實際上是非常困難的,除非您將實例與Foundation/UIKit完全隔離。

兩個可能的解決方案:

  • 不直接訪問伊娃。製作和使用訪問器,可能通過@property指令。這是「更正確」的解決方案,因爲庫A中實現的類可能不會直接從庫B中刪除類的ivars。通過訪問器更好地保留了封裝並且承認直接的iVar訪問在Objective-C中是非常非典型的模式(很大程度上僅限於直接訪問它自己的iVar的類)。

  • 聲明iVars是@public,並且已經離開了。脆弱,非典型,充滿危險。


在Objective-C專用的真正含義「那邊那個編譯單元不能看到這個聲明在這裏。」

因此,如果你願意,你可以聲明一個屬性 - 說 - 是公開只讀和讀寫私下:

了foo.h:

@interface Foo.... 
@property(readonly) int x; 
@end 

美孚+ Private.h:

@interface Foo() 
@property(readwrite) int x; 
@end 

Foo.m: #進口 「富+ Private.h」 @implementation富 @synthesize X; @end

任何進口Foo.h只會看到x是隻讀的。 Foo的實現將會看到它是readwrite。那麼還有其他什麼會導入Foo + Private.h。

+0

有沒有什麼辦法來'隱藏'的屬性,所以他們只在我的項目中可見? – 2010-11-01 13:00:54

+0

我已經決定讓它們公開,並且如果它們被修改就會產生後果。 – 2010-11-03 13:54:06