Xcode4時(shí)拣宏,@property只能生成getter杠人、setter方法的聲明;
從Xcode5開始辑莫,@property 可以自動(dòng)生成_propertyName成員變量和getter罩引、setter方法的聲明和實(shí)現(xiàn)。默認(rèn)情況下袁铐,getter横浑、setter方法作用于_propertyName變量屉更。
但是,當(dāng)同時(shí)重寫getter和setter兩個(gè)方法的時(shí)候张咳,實(shí)現(xiàn)了完全的自定義實(shí)現(xiàn)似舵,無法對(duì)應(yīng)到默認(rèn)的變量_propertyName,_propertyName就無效了砚哗,需要手動(dòng)定義一個(gè)變量或者使用@synthesize指定一個(gè)變量來綁定到屬性上蛛芥,通過@synthesize改變了屬性、getter仅淑、setter對(duì)應(yīng)的變量,這點(diǎn)很有用處赡鲜,比如可以在子類修改父類中readonly屬性的值庐船,可以修改協(xié)議中屬性值。
PersionProtocol.h
#import <Foundation/Foundation.h>
@protocol PersionProtocol <NSObject>
@property (nonatomic, strong) NSString *weight;
@end
Persion.h (遵守PersionProtocol協(xié)議)
#import <Foundation/Foundation.h>
#import "PersionProtocol.h"
@interface Persion : NSObject <PersionProtocol>
@property (nonatomic, strong, readonly) NSString *gender;
@property (nonatomic, assign) NSInteger age;
@end
Persion.m
@implementation Persion
@synthesize weight;
@synthesize age = nianLing;
- (instancetype)init {
self = [super init];
if (self) {
self.weight = @"100Kg"; // protocol中的屬性 實(shí)現(xiàn)@synthesize weight;
}
return self;
}
// 同時(shí)修改getter和setter方法時(shí)要實(shí)現(xiàn)@synthesize name = na 添加一個(gè)別名; 或者手動(dòng)添加一個(gè)別稱
- (void)setAge:(NSInteger)age {
nianLing = age;
}
- (NSInteger)age {
if (nianLing > 18) {
nianLing = 18; // 永遠(yuǎn)18歲
}
return nianLing;
}
@end
Mary.h (繼承Persion類)
#import "Persion.h"
@interface Mary : Persion
@end
Mary.m
@implementation Mary
// 子類中要訪問父類readonly屬性時(shí)
@synthesize gender = xingbie;
- (instancetype)init {
self = [super init];
if (self) {
self.age = 29;
xingbie = @"man";
self.weight = @"50Kg";
}
return self;
}
@end
- (void)viewDidLoad {
[super viewDidLoad];
Mary *mary = [[Mary alloc] init];
// 結(jié)果:man--18---50Kg
NSLog(@"%@--%ld---%@",mary.gender,mary.age,mary.weight);
}