OC - Property

来源:互联网 发布:创意中国设计大赛 知乎 编辑:程序博客网 时间:2024/06/06 13:05
<main.m>
#import <Foundation/Foundation.h>#import "Person.h"#import "Teacher.h"#import "Student.h"int main(int argc, const char * argv[]){    @autoreleasepool {        //创建 person 对象        Person *per = [Person  personWithName:@"zhangsan" sex:@"male" age:20];  //调用        [per setName:@"dafenqi"];        [per setSex:@"?"];        [per setAge:18];        NSLog(@"%@",per);         //创建 teacher 对象        Teacher *tea = [Teacher teacherWithName:@"lei" sex:@"male" age:26];                [tea setName:@"haha"];        [tea setSex:@"???"];        [tea setAge:18];        NSLog(@"%@",tea);         //*************************** 点语法 ********************************************          //创建学生对象        Student *stu = [Student studentWithName:@"dalaoliu" sex:@"male" age:18 number:@15];               //使用点语法                stu.sex = @"男";        stu.age = 21;                        NSLog(@"%@,%@ ,%ld,%@",stu.name,stu.sex,stu.age,stu.number);                //*************************** KVC ********************************************                        Student *stu1 = [[Student alloc ] init];                //使用 KVC强制访问 stu1 的实例变量        [stu1 setValue:@"蛋蛋" forKey:@"_name"];        NSLog(@"%@",stu1.name);        [stu1 setValue:@"男" forKey:@"_sex"];        NSLog(@"%@",[stu1 valueForKey:@"_sex"]);                              //如果没有对应的实例变量        //通过 KVC 设置值 需要重写 setValue:forUndefinedKey:          [stu1 setValue:@190 forKey:@"_weight"];        //通过 KVC 取值 需要重写 valueForUndefinedKey:        NSLog(@"%@",[stu1 valueForKey:@"_weight"]);                //     //        //通过字典给对象实例变量赋值//        NSDictionary *dataDic = [NSDictionary dictionaryWithObjectsAndKeys:@"jinpeng",@"name",@"nan",@"sex",@10012,@"number", nil];//        NSLog(@"%@",dataDic);//        //        [stu1 setValuesForKeysWithDictionary:dataDic];//        [stu1 sayHi];//        //        //        //     //创建 teacher 对象//        stu1.teacher = [[Teacher alloc ]init];//        //      //给学生中老师实例变量 的实例变量name赋值//        //        [stu1 setValue:@"西兰花" forKeyPath:@"teacher.name"];//        NSLog(@"%@",[stu1 valueForKeyPath:@"teacher.name"]);//        //        //            }    return 0;}


<Person.h>

#import <Foundation/Foundation.h>@interface Person : NSObject//{//    NSString *_name;//    NSString *_sex;//    NSInteger _age;//}-(id)initWithName:(NSString *)name              sex:(NSString *)sex              age:(NSInteger)age;+(Person *)personWithName:(NSString *)name                      sex:(NSString *)sex                      age:(NSInteger)age;/*  1.属性: OC 2.0之后出现的语法形式,快速帮助我们生成 setter 和 getter 方法的声明;  2.属性的定义: @property NSString *name;     @property  关键字     NSString *  数据类型     name  属性名    即 @property + 数据类型 + 属性名 3.生成了 setter 和 getter 方法,即 name: 和 name*/@property NSString *name;//-(void)setName:(NSString *)name;//-(NSString *)name;@property NSString *sex;//-(void)setSex:(NSString *)sex;//-(NSString *)sex;@property NSInteger age;//-(void)setAge:(NSInteger)age;//-(NSInteger)age;-(NSString *)description;@end

<Person.m>

#import "Person.h"@implementation Person-(id)initWithName:(NSString *)name              sex:(NSString *)sex              age:(NSInteger)age{    if ([super init]) {        _name =name;        _sex = sex;        _age = age;    }return self;}+(Person *)personWithName:(NSString *)name                      sex:(NSString *)sex                      age:(NSInteger)age{    return [[Person alloc] initWithName:name sex:sex age:age];}/*   @synthesize  完成属性是实现     @synthesize 1.实现了属性的name,age,sex      2.规定了该属性声明的 setter getter 方法所操作的实例变量      3.如果@ synthesize 省略不写,则自动生成对应属性的 setter 和 getter 方法,默认操作的实例变量是属性名+'_'      4.检测对应的实例变量,如果没有找到认为生成的实例变量,则会自动生成对应的实例变量('_' + 属性名)      5.如果我们重写 setter 和 getter 方法的实现,那么@ synthesize 就不会在时下对应的 stter 和 getter 方法也就不会检测实例变量是否存在,也就不会帮助我们生成对应的实例变量,则需要我们自己添加实例变量 *///@synthersize 写在@ interface 里面, 该语句也可以不写,不写就是默认的@synthesize name = _name ,age = _age ,sex = _sex;//代表所有 setter 和 getter 方法的实现//-(void)setName:(NSString *)name//{//    _name = name;//    //}//-(NSString *)name//{//    return _name;//}////-(void)setSex:(NSString *)sex//{//    _sex = sex;//}//-(NSString *)sex//{//    return _sex;//}////-(void)setAge:(NSInteger)age//{//    _age = age;//    //}//-(NSInteger)age//{//    return _age;//}-(NSString *)description{    return [NSString stringWithFormat:@"name:%@,sex:%@,age:%ld",_name,_sex,_age];}@end

<Teacher.h>

#import <Foundation/Foundation.h>@interface Teacher : NSObject{    NSString *_name;    NSString *_sex;    NSInteger _age;    NSNumber *_number;}/** 属性的属性: 1.读写特性 (1)readwrite (可读可写)默认属性,既生成setter方法,又生成gette方法 (2)readonly (只读),只生成getter方法,不会生成setter方法 (3)setter = 方法名,给生成的setter方法起一个其他的方法名 (4)getter = 方法名,给生成的getter方法起一个其他的方法名  2.原子特性 (1)atomic (原子特性)默认属性,保证线程安全,也就是当前的实例变量只能由一个线程访问,在这个过程中有一个加锁解锁的过程 (2)nonatomic (非原子特性),不会保证线程安全,但是一般情况下没有任何问题,而且执行效率远远高于 atomic, 又因为我们会频繁的访问实例变量,所以苹果官方推荐使用 nonatomic  3.语义特性 (1)assign 默认属性,一般用来修饰非对象类型的属性 (2)retain 针对于对象,会将对象的引用计数+1 (3)copy 针对于对象,将对象拷贝一份,产生一个新的对象 //注: 一般的 NSString为数据类型的时候需要为其属性添加copy的属性,其他对象添加retain属性  */@property (nonatomic,copy)NSString *name;@property (nonatomic,copy)NSString *sex;@property (nonatomic)NSInteger age;@property (nonatomic,retain)NSNumber *number;-(id)initWithName:(NSString *)name              sex:(NSString *)sex              age:(NSInteger)age;+(Teacher *)teacherWithName:(NSString *)name                        sex:(NSString *)sex                        age:(NSInteger)age;-(NSString *)description;@end

<Teacher.m>

#import "Teacher.h"@implementation Teacher-(id)initWithName:(NSString *)name              sex:(NSString *)sex              age:(NSInteger)age{    if ([super init]) {        _name = name;        _sex = sex;        _age = age;    }return self;}+(Teacher *)teacherWithName:(NSString *)name                        sex:(NSString *)sex                        age:(NSInteger)age{    return [[Teacher alloc]initWithName:name sex:sex age:age];}-(NSString *)description{    return [NSString stringWithFormat:@"name:%@,sex:%@,age:%ld",_name,_sex,_age];}//copy 下的 setter getter 实现-(void)setName:(NSString *)name{    if (name != _name) {        [_name release];        _name = [name copy];    }}-(NSString *)name{    return _name ;}//retain 下的 setter getter 实现-(void)setNumber:(NSNumber *)number{    if (_number != number) {        [_number release];        _number = [number retain];    }}-(NSNumber *)number{    return _number ;}//assign 下的 setter 和 getter-(void)setAge:(NSInteger)age{    _age = age;}-(NSInteger)age{    return _age;}@end

<Student.h>

#import <Foundation/Foundation.h>#import "Teacher.h"@interface Student : NSObject{    NSString *_name;    NSString *_sex;    NSInteger _age;    NSNumber *_number;}@property (nonatomic,copy)NSString *name;@property (nonatomic,copy)NSString *sex;@property (nonatomic)NSInteger age;@property (nonatomic,retain)NSNumber *number;@property (nonatomic,retain)Teacher *teacher;//初始化-(id)initWithName:(NSString *)name              sex:(NSString *)sex              age:(NSInteger )age           number:(NSNumber *)number;//构造器+(Student *)studentWithName:(NSString *)name                        sex:(NSString *)sex                        age:(NSInteger)age                     number:(NSNumber *)number;-(void)sayHi;@end

<Student.m>

#import "Student.h"@implementation Student-(id)initWithName:(NSString *)name              sex:(NSString *)sex              age:(NSInteger )age           number:(NSNumber *)number{    if ([super init]) {        self.name = name;   //[self setName:name]        self.sex = sex;        self.age = age;        self.number = number;    }return self;}+(Student *)studentWithName:(NSString *)name                        sex:(NSString *)sex                        age:(NSInteger)age                     number:(NSNumber *)number{    return [[Student alloc ] initWithName:name sex:sex age:age number:number];}-(void)sayHi{    NSLog(@"name:%@,sex:%@,age:%ld,number:%@",_name,_sex,_age,_number);}//setter  getter-(void)setName:(NSString *)name{    if (_name != name) {        [_name release];        _name = [name copy];    }}-(NSString *)name{    return _name;}-(void)setSex:(NSString *)sex{    if (_sex != sex) {        [_sex release];        _sex = [sex copy];    }}-(void)setAge:(NSInteger)age{    _age = age;}-(NSInteger)age{    return _age;}-(void)setNumber:(NSNumber *)number{    if (_number != number) {        [_number release];        _number = [number retain];    }}-(NSNumber *)number{    return _number;}-(void)setValue:(id)value forUndefinedKey:(NSString *)key{    NSLog(@"没有对应的实例变量key:%@",key);}-(id)valueForUndefinedKey:(NSString *)key{    NSLog(@"没有对应 key:%@",key);    return nil;}@end


0 0
原创粉丝点击