such as:
1 2 3 4 5 6 7 8 9 10 11 |
#import <Cocoa/Cocoa.h> @interface Photo : NSObject { NSString* caption; NSString* photographer; } - (NSString*) caption; - (NSString*) photographer; @end |
現在添加setter:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#import <Cocoa/Cocoa.h> @interface Photo : NSObject { NSString* caption; NSString* photographer; } - (NSString*) caption; - (NSString*) photographer; - (void) setCaption: (NSString*)input; - (void) setPhotographer: (NSString*)input; @end |
Setter不需要返回值,所以設置為void。
6. 類實現
從getter開始創建實現:
1 2 3 4 5 6 7 8 9 10 11 12 13 |
#import "Photo.h" @implementation Photo - (NSString*) caption { return caption; } - (NSString*) photographer { return photographer; } @end |
這部分的代碼由@implementation和類名開始,並且像接口一樣有@end。所有的方法必須放在這兩個聲明之間。
如果之前做過編碼,getter看起來應該非常熟悉,所以將精力放在setter上,這需要一些解釋:
1 2 3 4 5 6 7 8 9 10 11 |
- (void) setCaption: (NSString*)input { ; caption = [input retain]; } - (void) setPhotographer: (NSString*)input { [photographer autorelease]; photographer = [input retain]; } |
每個setter有兩個變量。第一個是已有對象的引用,第二個是新輸入的對象。在垃圾回收環境中,可以直接設置新值:
1 2 3 |
- (void) setCaption: (NSString*)input { caption = input; } |
但是如果不能使用垃圾回收,就需要釋放(release)舊對象,並保持(retain)新對象。
實際上有兩種方式釋放對象的引用:釋放(release)和自動釋放(autorelease)。標准的釋放將會立即移除引用。自動釋放方法將會在一小會后釋放,但可以明確的是它會保留到當前函數結束(除非添加自定義的代碼明示改變這個規則)。
自動釋放方法在setter中更加安全一些,因為變量的新舊值會指向相同的對象。肯定不想立刻釋放需要保持的對象。
現在似乎有一些混亂,但是將會按照進度有一個整體的介紹。現在無需弄清楚所有內容。