main.m
Person *p = [[Person alloc] init]; [p setName:@"doubi"]; [p setGender:@"man"]; [p setAge:23]; //点语法: //对象.属性名 //凡是与系统默认setter和getter方法实现相似的方法都可以使用点语法来调用. //如果点语法在等号的左侧,代表调用的是setter方法 //如果点语法在等号的右侧,代表调用的是戈塔特人方法 NSLog(@"%@,%@,%ld",p.name, p.gender, p.age);
Person.h
@interface Person : NSObject //{ // NSString *_name; // NSString *_gender; // NSInteger _age; //} /* 属性的作用:自动生成setter以及getter方法 属性定义@property + 属性的类型(和内部操作的实例变量的类型一致)+属性名(和内部操作的实例变量名相同) 属性在.h中自动生成setter和getter方法 */ @property NSString *name; //- (void)setName:(NSString *)name; //- (NSString *)name; @property NSString *gender; //- (void)setGender:(NSString *)gender; //- (NSString *)gender; @property NSInteger age; //- (void)setAge:(NSInteger)age; //- (NSInteger)age; @end
Person.m
@implementation Person /* 当系统自动生成setter以及getter方法时,如果此时没有自己重写setter和getter方法,系统不但会帮你实现setter以及getter,而且会生成相应的实例变量,只不过实例变量是私有的,子类无法访问 @synthesize 在.m中作用: (1)生成setter和getter方法的内部实现 (2)生成setter和getter内部操作的实例变量 //当自己实行了setter和getter方法,系统就不在帮我们生成实例变量,此时要自己定义实例变量或者使用@synthesize解决 如果仅仅实现了setter或者getter中的一个,那么系统还会帮我们生成对应的实例变量 当我写了@synthesize name = _name;这句话之后,setter和getter我即可以不写,也可以重写一个,更可以重写两个 */ @synthesize name = _name; @synthesize gender = _gender; @synthesize age = _age; //@property (nonatomic) )setName:(NSString *)name{ // if(_name != name){ // [_name release]; // _name = [name retain]; // } //} // //- (NSString *)name{ // return [[_name retain] autorelease]; //} //当属性name的语义特性设置为copy 时的stter以及getter方法的内部实现 //- (void)setName:(NSString *)name{ // if(_name != name){ // [_name release]; // _name = [name copy]; // } //} //- (NSString *)name{ // return [[_name retain] autorelease]; //} // //- (void)setGender:(NSString *)gender{ // if (_gender != gender) { // [_gender release]; // _gender = [gender retain]; // } //} //- (NSString *)gender{ // return [[_gender retain] autorelease]; //} @end /** * 读写特性:读-----getter,写------setter 1.readonly:(只读)该属性只会生成getter方法,不会生成setter方法 2.readwrite:(读写)该属性即会生成setter方法,也会生成getter方法,系统默认的特性 3.setter = 方法名 ,指定在生成setter方法时,setter方法的方法名 4.getter = 方法名,指定在生成getter方法时 ,getter的方法名 */ /** * 原子特性 1.atomic (原子性):保证线程安全,系统默认特性 2.nonotomic (非原子性):不保证线程安全,系统推荐.因为对于setter以及getter方法,可能会在一段时间内频繁的调用,如果每次都要开锁,加锁,这样会非常消耗系统支援降低程序的执行效率,因此,苹果从效果上考虑,推荐大家使用nonatomic */ /** * 语义特性 1.assign:主要针对基本数据类型, NSInterger CGFloat, BOOL,NSCOMparisonResult 2.retain:只能针对与对象类型使对象的引用计数+1 3.copy:只能针对,但是需要该类服从NSCopying协议,copy是将对象赋值出来一份,然后使赋值出来的对象的引用计数+1 */ //当属性name的语义特性设置为assign时的setter以及getter方法的内部实现.(直接赋值) //- (void)setName:(NSString *)name //{ // _name = name; //} //- (NSString *)name //{ // return _name; //} //当属性name的语义特性设置为return是的setter以及getter方法的内部事件. //- (void)setGender:(NSString *)gender //{ // _gender = gender; //} //- (NSString *)gender //{ // return _gender; //} // //- (void)setAge:(NSInteger)age //{ // _age = age; //} //- (NSInteger)age //{ // return _age; //} //- (id)initWithName:(NSString *)name gender:(NSString *)gender age:(NSInteger)age //{ // if (self = [super init]) { // _name = name; // _gender = gender; // _age = age; // } // return self; //}