2010-08-14 23 views
0

可以肯定地說,如果一個類成員不需要getter或setter函數,那麼使它們的屬性和綜合它們沒有意義?使類成員的屬性和綜合它們

+0

Objective-C中沒有「類成員」這樣的事情。你在問C++嗎?如果不是,你在問什麼? – 2010-08-14 05:44:19

+0

我正在談論你在.h文件中的@interface之後聲明的那些東西。如果他們不被稱爲類成員,那麼他們稱爲接口成員? – 2010-08-14 06:43:16

+0

實例變量。您應該閱讀Objective-C編程語言文檔:http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/ObjectiveC/ – 2010-08-14 12:58:12

回答

2

好的,但是,即使屬性不會在實現之外設置,屬性在實現本身中也可能會有所幫助。

例如,假設你有

@interface SomeObject : NSObject { 
    NSThing *thing; 
} 
@end 

@implementation SomeObject 

- (id)init { 
    if((self = [super init])) 
     thing = [[NSThing someThing] retain]; 
    return self; 
} 

- (void)someMethod { 
    if(thing) 
     [thing release]; 
    thing = [[NSThing someOtherThing] retain]; 
} 

// etc etc 

@end 

你爲什麼要費心思,檢查是否thing已被分配,釋放thing,將其設置爲別的東西,然後再retain它,當你可以簡單地做:

- (id)init { 
    if((self = [super init])) 
     [self setThing:[NSThing someThing]]; 
    return self; 
} 

- (void)someMethod { 
    [self setThing:[NSThing someOtherThing]]; 
} 

如果你不想讓這些屬性類的訪問之外,你可以使用一個類

@interface SomeObject() 
@property (retain) NSThing *thing; 
@end 

在您的.m文件中。

+0

這實際上稱爲類擴展。一個類別*應該*有一個單獨的接口和一個單獨的實現(儘管編譯器目前允許你在沒有單獨實現的情況下離開),但類擴展只是類的主接口的延續,所以它聲明的方法必須在類的主要實現中實現,與在類的實際主接口中聲明的任何方法相同。 – 2010-08-14 05:46:51

+0

另外,你通常不應該在你的'init'方法和'dealloc'方法中使用訪問器。如果你定義了一個自定義存取器,或者一個子類覆蓋了你的存取器,那麼這個存取器對於一個半入/半取出分配的對象可能是不安全的。你應該在類的任何地方使用訪問器,但是應該在'init'方法和'dealloc'中避免它們。 – 2010-08-14 05:48:33