OC第八天

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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值