IOS--OC--LessonProperty 属性 点语法

来源:互联网 发布:隐藏应用的软件 编辑:程序博客网 时间:2024/05/22 20:12

一 属性 property  synthesize

1. 快速的生成 setter 和 getter 的方法

例: 声明部分 

原始:

{

   NSString *_name;

    NSInteger _age;

}

- (void) setName:(NSString *)name;

- (NSString *)name;


- (void) setAge :(NSString *)age;

-(NSString *)age;

修改后:

@property NSString * age;

@property NSString *name;

修改后的 set 和 get 都不用在写


属性的实现:

例:原始:

- (void) setName:(NSString *)name{

   _name = name;

}

- (NSString *)name{

   return_name;

}


 修改后:

@synthesize name;

@synthesize age;


Tips: ①在@ property 里面 同类型的实例变量 可以合并写在一起 比如:上面写道的 name 和 age 是同属 NSString 

@property NSString * age;

@property NSString *name;


等价于


@property NSString * age,*name;



优势:

1.声明的是同一种类型 可以合并;

2. 省略实例变量的定义 即{}大括号里的东西 系统会自动帮我们设定;

3.属性的实现可以省略,连@synthesize 也可以不用;但是自定义初始化和便利构造器不可以



----------------------------Nyx--------------------------------


二  属性的属性(attribute )

1.读写组
readwrite :可读可写, 自动生成 setter 和 getter 方法  默认值°

readonly :只读取 自动生成 getter 方法

注:默认值:如果在@ property ()括号中不写出 也默认

2.重名组   

为了方便比较长的 setter 和 getter 变量名打印 重新取个名字

setter = 新名字;    getter = 新名字;

例:

@property (nonatomic,retain,setter=setGGG:,getter=GGG)NSString *name;

[girl setGGG= @"水电费"];

NSLog(@"%@",girl GGG]); 

注:1⃣️就是将 setter 和 getter 用了你重新定义的新名字打出来 为了不让别人看出你用的是什么实例变量

   2⃣️ 你在重写 setter 和 getter 的时候 系统就不会再自定义 syntensize;


----------------------------Nyx--------------------------------



2. 原子性 atomic

① atmoic:原子性 在 setter 和 getter 内部进行了安全的多线程访问 

  优点:安全 

  缺点:效率低   在运行的过程中不断的对settergetter加锁解锁以保证线程访问安全,会很占⽤用系统资源,降低

系统性能。  只在特定那些需要安全的线程的适合才会使用

② nonatmoic:非原子性 可以同时进行普通的 setter 和 getter  无多线程

  优点:效率高

  缺点:不安全 ,还是公路 可以相对同时行驶,但是容易出车祸呀~

例:

@property (nonatomic,copy)NSString *name;

注:大部分情况下还是nonatomic ,因为atmoic不能同时建立 setter 和 getter 比较麻烦


----------------------------Nyx--------------------------------



3.内存管理

1.assign 操作非对象类型 基本数据类型,比如:NSInteger;CGFloat;

在 setter 和 getter 的内部直接复制

 例:

@property (nonatomic,assign)NSInteger age;

- (void)setAge:(NSInteger)age{

_age = age;

}

- (NSInteger)age{

return _age;

}

@property (nonatomic,assign)CGFloat score;


----------------------------Nyx--------------------------------



2.retain 对象类型 比如:NSString; NSArray;

在 setter 和 getter 内部进行优化

例:

@property (nonatomic ,retain)NSString  *gender;

- (void)setGender:(NSString *)gender{

if (name != name){

[_name release]

_name = [name retain]

}

}

-(NSString *)name{
return [[_name retain]autorelease];
 

}


@property (nonatomic ,retain)NSString *age;


----------------------------Nyx--------------------------------



3.copy 对象类型 使用时 要遵守NSCopying 的协议

既能 setter 和 getter 内部实现 也能内部优化

 例:

@property (nonatomic,copy)NSString *name;

(cmd +鼠标左键选中 NSString 跳入源代码)

@interface NSString :NSObject <NSCopying,NSMutableCopying,NSSecureCoding>


----------------------------Nyx--------------------------------


4.  点语法

1.在 main 函数中 快速访问 setter 和 getter 的方法

例:

① 假定我们设定好了 Gril 的声明和方法

传统的访问实例变量方法:

   Girl *girl = [[Girlalloc]init];

    [girlsetName:@"乐芙兰"];-------->> girl.name =@"乐芙兰";  点语法

   NSLog(@"%@",[girlname]);-------->> NSL@("%@",girl.name);  

2.判断什么是 setter 和 getter

 点语法后面跟着等号(=,)设置器(setter)方法

例:girl.name = @"乐芙兰";

② 点语法后面什么也没有是访问器(getter方法)

例:  NSL@("%@",girl.name)


----------------------------Nyx--------------------------------


三 KVC  Key Value Coding  (键值编码)

1.定义:一种间接访问实例变量的方法; 不通过 setter 和 getter 的方法 就可以取到值

      key :标识实例变量

      value :实例变量对应的值


2.不需要 setter 和 getter 但是需要实例变量名

例: name 就是你在. h 定义的变量名

[son setValue:@"西瓜"forKey:@"name"];

 NSLog(@"%@",[sonvalueForKey:@"name"]);


3.通过路径来修改实例变量的值

KVC:  [ son setValue:@"akal"forKeyPath:@"girlfirend.name"];

    NSLog(@"%@",girl1.name);

    

传统方法:  NSString *aName1 = [[sonvalueForKey:@"girlfirend"]valueForKey:@"name"];

    NSLog(@"%@",aName1);


注: KVC 有点类似字典


0 0
原创粉丝点击