小談 @synthesize 與 @dynamic


通常我們會這樣做:

在Test.h中:

@interface Test : NSObject{
    NSString *_name;
}
@property(nonatomic,retain) NSString *name;
@end


在Test.m中:

@implementation Test
@synthesize name = _name;
@end

解析:使用@synthesize之後,編譯器會自動幫我們生成setter和getter方法。






另一種情況:

在Test.m中:

@implementation Test

@dynamic name;

- (void)setName:(NSString *)newName
{
    if (_name != newName) {
        [newName retain];
        [_name release];
        _name = newName;
    }
}

- (NSString *)name
{
    return _name;
}

@end

解析:使用@dynamic,作用是告訴編譯器我們自己定義setter和getter方法。 






概括:

當然寫了@synthesize,我們也可以自己再定義一次setter和getter方法,這時我們自定義的就會覆蓋編譯器幫我們生成的方法。如果既不寫@synthesize又不寫@dynamic是可以的,這種情況就默認要我們自己定義setter和getter方法。但是寫上是一種良好的編程習慣,好處是:如果太多屬性的時候,我們只要一看這些指示符(@synthesize@dynamic),就知道每個屬性是如何實現的。


如果我們寫了@dynamic,但是沒有自定義setter和getter方法,沒有出現警告,可以編譯,但是執行到setter或getter方法的時候會出錯。






發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章