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;
}