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
- OC第八天
- OC第八天
- OC第八天:属性
- OC第八天 属性 点语法 KVC
- 【OC语言】第八天·block和Protocol
- 我的iOS学习历程 - OC第八天
- 第八天
- 第八天
- 第八天
- 第八天
- 第八天
- 第八天
- 第八天
- 第八天
- 第八天
- 第八天
- 第八天
- 第八天
- <picture>-浏览器内置的响应式标签(翻译)
- Linux 内核--总线设备驱动模型(字符/块/网络设备 && platform设备)
- Android中自定义View的onMeasure以及MeasureSpec使用
- mac osx安装groovy
- java四舍五入保留两位小数方法整理
- OC第八天
- Android Context 上下文 你必须知道的一切
- Rename column SQL Server 2008(修改字段名)
- list转换json
- 为什么object.onkeyup=function(){}函数无法执行?
- leetcode第137题-Single Number II
- 关联模型主被动关联的区别
- 取消了PAT,没有遗憾,只是有种无力感
- wireshark数据包分析实战 总结