OC - Property
2015-08-14 20:12
537 查看
<main.m>
<Person.h>
<Person.m>
<Teacher.h>
<Teacher.m>
<Student.h>
<Student.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
相关文章推荐
- 在网站中嵌入视频教学系统
- Docker安装应用程序(Centos6.5_x64)
- android /linux休眠与唤醒(二)
- linux根目录下文件体系
- Ubuntu linux 上搭建SERVER的相关使用说明
- centos6.7源码安装mysql
- leetcode 138 —— Copy List with Random Pointer
- 解决 Linux Mint 17.2 Nvidia驱动下屏幕亮度无法调节问题
- RedHat Enterprise Linux5关于中文显示乱码问题解决
- Nginx内存管理
- Linux线程-互斥锁pthread_mutex_t
- Hadoop实战之hadoop2.5.2完全分布式安装
- 【OpenCV】高斯混合背景建模
- Apache与Tomcat 区别联系
- (转)Apache与Tomcat 区别联系
- MyEclipse 项目部署到tomcat时出现错误之——deploy
- 关于linux的默认网关,双网卡不同网段
- Openstack-Ceilometer-获取主机内存 的使用
- Tomcat启动报Error listenerStart错误,如何定位问题呢
- Linux 默认路由表 0.0.0.0