OC - Property
来源:互联网 发布:创意中国设计大赛 知乎 编辑:程序博客网 时间:2024/06/06 13:05
<main.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
0 0
- OC - Property
- OC OC中的@property
- OC-015.OC中的@property
- Oc属性 @property @synthesize
- OC属性property使用
- OC中property参数
- OC中的property简介
- OC属性property
- OC-属性property
- OC学习 -- Property
- 黑马程序员-oc@property
- OC-@property增强使用
- OC--@property指令
- OC --- property(属性)
- OC属性Property-(摘要)
- OC中@property
- 【OC】@property的特性
- OC-@property和@synthesize理解
- 九度oj 1031
- JAVA内存泄露原因解析
- 【Ajax技术】Ajax技术回顾与XHR对象的创建
- linux下rpm,yum,apt-get安装软件
- 利用tcpdump+wireshark对android进行抓包分析
- OC - Property
- python3之循环
- 在网站中嵌入视频教学系统
- STM32的bootloader注意啥
- Java 内部类详解
- hdu 1069 dp
- UVa10596 Morning Walk
- poj 1269
- Spring-任务调度