OC第八天

来源:互联网 发布:生刷枪软件下载 编辑:程序博客网 时间:2024/05/20 15:41

Person.h

#import <Foundation/Foundation.h>@interface Person : NSObject{    NSString *_name;    NSString *name;}//用@property声明属性;实例变量名字前不要下划线“_”//readonly属性是只声明getter方法,没有setter的声明//readwrite属性 声明了setter和getter,默认情况是readwrite//atomic是原子性操作,这种操作是线程安全的,系统默认实现setter方法和getter方法中有线程锁的操作,方法被访问时方法中的资源就会被锁上,不让其他任务访问到该资源,当访问结束时资源才会被解锁//atomic是非原子性操作,方法在被访问中是不加线程锁的,非原子性是不安全的,但是效率比较高//这两种操作默认情况是atomic操作,但是一般都采用非原子性nonatomic的操作;因为效率高,不安全性只是理论级//assign赋值,一般操作的是基本数据类型,比如:int float等类型//retain和copy赋值,操作的是对象类型,retain操作的是原来的类型,copy操作新内存@property (readwrite,retain,nonatomic)NSString *name;//声明属性 是在.h文件中默认实现实例变量的setter和getter的声明//-(void)setName:(NSString *)name;//-(NSString *)name ;//声明一个打印方法-(void)printName;@end

Person.m

#import "Person.h"@implementation Person//3、在.m中不对属性进行实现;在Xcode4.5之后才有的功能,系统默认实现属性,自动给类添加一个实例变量,实例变量的名字是下划线属性名(_属性名);//1、实现属性  属性名 =实例变量名  ;属性实现的setter和getter就是赋值给属性的实例变量@synthesize name = _name;//2、@synthesize name; //在实现属性的时候,如果没有给属性名赋值,那么系统会默认给类添加一个实例变量,实例变量跟属性名字相同//默认实现了setter和getter-(void)setName:(NSString *)name{//    NSLock *lock = [[NSLock alloc]init];//    [lock lock];    if (_name != name) {        [_namerelease];        _name = [nameretain];    }//    [lock unlock];}//实现一个打印方法-(void)printName{    NSLog(@"_name = %@",_name);    NSLog(@"name = %@",name);}@end

Teacher.h

#import <Foundation/Foundation.h>@interface Teacher : NSObject{    NSString *_name;   //姓名    NSString *_sex;    //性别    int       _age;    //年龄}//声明属性,即完成了setter和getter方法的声明@property NSString *name;@property NSString *sex;@property int age;//声明自定义初始化方法-(instancetype)initWithName:(NSString *)name Sex:(NSString *)sex Age:(int)age;//声明便利构造器方法+(instancetype)teacherWithName:(NSString *)name withSex:(NSString *)sex withAge:(int)age;//声明功能方法-(void)printName;@end

Teacher.m

#import "Teacher.h"@implementation Teacher//声明属性,即完成了setter和getter方法的声明@synthesize name = _name, sex = _sex, age =_age;//自定义初始化方法-(instancetype)initWithName:(NSString *)name Sex:(NSString *)sex Age:(int)age{    self = [superinit];    if (self) {        _name = name;        _sex = sex;        _age = age;    }    returnself;}//便利构造器方法+(instancetype)teacherWithName:(NSString *)name withSex:(NSString *)sex withAge:(int)age{    return  [[selfalloc]initWithName:nameSex:sexAge:age];}//声明功能方法-(void)printName{    NSLog(@"name = %@",_name);}@end

Student.h

#import <Foundation/Foundation.h>@interface Student : NSObject//属性的声明@property (nonatomic,retain)NSString *name;@property (nonatomic ,retain)NSString *sex;@property (nonatomic,retain)NSString *address;@property (nonatomic ,assign)int age;//@property int age;//声明自定义初始化方法-(instancetype)initWithName:(NSString *)name andSex:(NSString *)sex andAddress:(NSString *)address andAge:(int)age;//声明一个便利构造器+(instancetype)studentWithName:(NSString *)name andSex:(NSString *)sex andAddress:(NSString *)address andAge:(int)age;//声明一个打印名字方法-(void)printName;@end

Student.m

#import "Student.h"@implementation Student//实现自定义初始化方法-(instancetype)initWithName:(NSString *)name andSex:(NSString *)sex andAddress:(NSString *)address andAge:(int)age{    self = [superinit];    if (self ) {        _name = name;        _sex = sex;        _address = address;        _age = age;    }    returnself;}//实现便利构造器+(instancetype)studentWithName:(NSString *)name andSex:(NSString *)sex andAddress:(NSString *)address andAge:(int)age{    return [[selfalloc]initWithName:nameandSex:sexandAddress:addressandAge:age];}//实现一个打印名字方法-(void)printName{    NSLog(@"_name = %@",_name);}@end

Bird.h

#import <Foundation/Foundation.h>#import "Person.h"@interface Bird : NSObject{    NSString *_name;    NSString *_sex;    NSString *_color;    //声明一个人对象    Person *_people;}@property(nonatomic,retain)Person *person;@end

Bird.m

#import "Bird.h"@implementation Bird-(NSString *)description {    return [NSStringstringWithFormat:@"name:%@ sex:%@ color:%@",_name,_sex,_color];}//系统在这个方法中实现了 如果没有找到相应的KEY对应的实例变量,就会抛出异常导致程序崩溃,//系统同时也让你重写这个方法,在这个方法中处理找不到实例变量的KEY;-(void)setValue:(id)value forUndefinedKey:(NSString *)key{    if ([keyisEqualToString:@"gender"]) {        _sex = value;    } else {        [supersetValue:valueforKey:key];    }}@end

main.m

#import <Foundation/Foundation.h>#import "Person.h"#import "Teacher.h"#import "Student.h"#import "Bird.h"int main(int argc,constchar * argv[]) {    @autoreleasepool {        /*        Person *person = [[Person alloc]init];        [person setName:@"zhangsan"];//        NSLog(@"name = %@",[person name]);        [person printName];        */        /*        Teacher *teacher = [Teacher teacherWithName:@"laosan" withSex:@"男" withAge:@22];//        [teacher setName:@"laosi"];//        teacher.name = @"laowu";        //点语法操作属性,点语法用在等号前面相当于一个setter方法;调用setter方法//        点语法用在等号后面,相当于一个getter操作        teacher .sex = teacher.name;        NSLog(@"teacher.sex = %@",teacher.sex);        [teacher printName];        Person *per = [[Person alloc]init];        per.name = @"name";        */        Bird *bird = [[Birdalloc]init];        NSLog(@"bird = %@",bird);//        通过kvc间接赋值的方式,1、查找类中是否有setter方法(-setName);2、如果setter方法不存在,则去找相应的实例变量进行赋值,依次查找(_name,_isName,name,isName);3、如果实例变量也不存在,就会出现崩溃        [bird setValue:@"zhangsan"forKey:@"name"];        NSLog(@"bird1 = %@",bird);//        给性别赋值        [bird setValue:@"男"forKey:@"gender"];        NSLog(@"gender = %@",bird);/*====================重要=============================*/        //通过这个方法可以给类的所有实例变量都赋上值        NSDictionary *dic =@{@"name":@"lisi",@"sex":@"男",@"color":@"red"};        [bird setValuesForKeysWithDictionary:dic];        NSLog(@"bird3 = %@",bird);/*=====================================================*/        Person *p = [[Personalloc]init];        bird.person = p;        //通过KeyPath这种方式给实例变量的实例变量赋值        [bird setValue:@"laoda"forKeyPath:@"person.name"];        NSLog(@"p = %@",p.name);      }    return0;}
0 0