2013-02-17 99 views
1

幾年前,有一個問題涉及實例與類方法。用下面的代碼說明了它。我大部分都明白,除了爲什麼我需要實例變量「年齡」和實例方法「年齡」?objective-c實例變量

不會使用@synthetize創建變量「age」的getter和setter嗎?

Static int numberOfPeople = 0; 

@interface MNPerson : NSObject { 
    int age; //instance variable 
} 

+ (int)population; //class method. Returns how many people have been made. 
- (id)init; //instance. Constructs object, increments numberOfPeople by one. 
- (int)age; //instance. returns the person age 
@end 

@implementation MNPerson 
- (id)init{ 
    if (self = [super init]){ 
      numberOfPeople++; 
      age = 0; 
    }  
    return self; 
} 

+ (int)population{ 
    return numberOfPeople; 
} 

- (int)age{ 
    return age; 
} 

@end 
main.m: 

MNPerson *micmoo = [[MNPerson alloc] init]; 
MNPerson *jon = [[MNPerson alloc] init]; 
NSLog(@"Age: %d",[micmoo age]); 
NSLog(@"%Number Of people: %d",[MNPerson population]); 

(從@micmoo原始代碼)

+1

「__不要使用@synthetize創建實例變量」age「的getter和setter?__」發佈的代碼不使用屬性。這段代碼中沒有'@ property'或'@ synthesize'。 – rmaddy 2013-02-17 19:03:24

回答

5

實例方法age封裝。它允許子類覆蓋該方法,如果需要的話可以提供不同的實現。例如,子類可能希望根據初始日期和當前日期計算年齡,而不是存儲它。如果使用實例變量,子類將無法覆蓋age;如果你添加一個實例方法,那麼子類將能夠提供新的實現。

另一個好處是,你不能寫age:你的班級的用戶可以得到age,但他們不能set它。

將不會獲取變量「age」的getter和setter與@synthetize

@synthesize需要一個屬性聲明,這是從類中丟失。屬性對於該語言來說是相對較新的,這可以解釋爲什麼它們沒有用在您找到的代碼中。

做同樣的事情被宣告財產而不是伊娃和訪問,並且完全跳過@synthesize的電流方式:

@property (nonatomic, readonly) int age; 

您可以通過指定從類中寫age_age,自動創建備份變量;用戶可以使用[obj age]obj.age語法讀取該值。

3

此代碼顯然在寫入之前引入聲明的屬性和@sythesize指令,這與所謂的「目標C 2.0」引入Mac OS X Leopard的時間。簡要介紹is available at The Cacao,它將向您展示舊方式的樣子。

是的,用現代方式做它會好得多,但在那些黑暗時代,我們必須在類的界面中聲明每個ivar,並手動編寫每個setter和getter。每一個人,無論從哪個方面,都在雪地上,沒有靴子。