1、属性:帮你自动生成setter
和 getter 方法
    
属性的声明:(写在.h中)
    
格式: @property 数据类型 属性名
    
属性的实现:(写在.m中)
    
格式: @synthesize 属性名:
例子1:
Person.h
@interface Person : NSObject
//属性的声明:属性:属性名就是实例变量名去掉下划线

@property NSString *gender;
@end

Person.m
//属性的实现
@synthesize gender;
@end

main.m
//属性方法实现gender的setter和getter方法

person.gender = @"妖";

   
NSLog(@"%@",person.gender);//点语法

   
NSLog(@"%@",[person
gender]);//setter、getter方法
例子2:
teach.h
@interface
Teacher
: NSObject
//输入属性的类型相同的话,此时就可以把它们写在一个属性声明中,但是每一个属性名前要加*,(是基本数据类型的就不用加*)
@property
NSString
*name,*color;

@property
NSInteger
age;
@property CGFloat
score;
@end

teach.m
//属性的实现部分可以写在一起,用逗号隔开
//@synthesize
name,color,age,score;
//自Xcode5.0之后属性实现部分不应写了,极大提高了变成速率
//如果不写了,系统默认帮你生成以下语句,自动创建一个_name实例变量,并且自动生成setter
和getter方法
//如果实例变量不写

//@synthesize
name = _name;

- (NSString
*)description
{   
+++++++++description
中不能打印self+++++++++++
   
// return [NSString
stringWithFormat:@"%@-%ld-%.2lf-%@-%@",
_name,_age,_score,_color,self];
 
   
 (1)ERROR!!!
   
return
[NSString
stringWithFormat:@"%@-%ld-%.2lf-%@",
_name,_age,_score,self.color];//这样是可以的
属性的优化:
 1.属性的声明和实现可以合并

 2.实现可以省略实例变量的声明(系统自动帮你生成属性名 加下划线的实例变量
如:_name)
 3.属性的实现可以省略

main.m
  //定义一个Teacher类,实例变量name age
score color
   
//定义一个Teacher对象

Teacher
*tea =
[[Teacher
alloc]init];

tea.name
=
@"小仓";

tea.age
=
18;

tea.score
=
85.3;

   
tea.color
=
@"纯白种人";
   
NSLog(@"%@-%ld-%.2lf-%@",tea.name,tea.age,tea.score,tea.color);
   
NSLog(@"%@",tea);
======================================================
2、属性的属性:属性的修饰符  
主要用来控制setter 和 getter 的方法的实现细节
    
1.访问控制组
atomic:原子性,修饰的属性同一时刻只能使用setter 或getter,(setter和getter
是互斥的),安全但效率低;
        
atomic
使用场景:在多线程下为保护数据安全可以使用atomic
   
     
       
nonatomic :非原子性,允许同时使用setter
或getter方法,不安全但效率高,推荐使用nonatomic
    
2.内存管理组

    
assign 默认值 
基本数据类型使用assign修饰,代理属性使用assign修饰

    
retain 对象类型一般使用retain
    
copy 
字符串一般用copy修饰,如果要使用copy修饰属性,这个属性必须遵循NSCoping协议
    
3.读写控制组

    
readWrite : 可读可写,自动帮你生成setter 和getter 方法  
默认值
    
readOnly  :只读,系统只帮你生成getter方法
    
4.重命名组
    
setter = setter新名字
    
getter = getter 新名字
(除了BOOL特殊情况,其他的一般不使用这种方法)
例子1:定义一个Boy的类;实例变量 name age
gender
 
  自定义初始化方法
 
  遍历构造器方法
 
  重写description
方法

Boy.h
@interface
Boy :
NSObject
//属性修饰符写在@propety后面的()小括号中

//属性修饰符可以写多个,每一个修饰符之间用逗号隔开

//系统默认readwrite 
,平时可以不写
@property
(nonatomic,copy,readwrite,setter=setAAA:,getter=AAA)NSString
*name;
@property
(atomic,copy,readwrite)NSString
*gender;
@property
(nonatomic,assign,readonly)NSInteger 
age;
//苹果的习惯,如果一个属性是Bool类型的,会对getter方法重命名
@property
(nonatomic,assign,readwrite,getter=isFalg)BOOL
flag;
@end

Boy.m
 使用属性可以不写实现部分

main.m
//建一个Boy对象

Boy
*boy =
[Boy
boyWithName:@"zhangsan"
gender:@"yao"
age:18];

   
NSLog(@"%@",boy);
//
readOnly  只读不能写
//   
boy.age = 18;   error!!
   
NSLog(@"%ld",boy.age);
   
//name属性的setter和getter方法起了别名

[boy
setAAA:@"Lisi"];

NSLog(@"%@",[boy
AAA]);

boy.name
=
@"Wanger";

NSLog(@"%@",boy.AAA);

boy.name
=
@"Mazi";

   
NSLog(@"%@",boy.name);
例子2: 定义一个Girl类,实例变量
name,sex,age,height,写属性的属性,自定义初始化方法,便利构造器方法,重写description方法

Girl.h
@interface
Girl :
NSObject

@property
(nonatomic,copy)NSString
*name;
@property(nonatomic,copy)
NSString
*sex;
@property
(nonatomic,assign)NSInteger
age;
@property
(nonatomic,assign)CGFloat
height;
//-
(void)sayHi; error!!!

- (id)initWithGirlFriend
: (NSString
*)name sex :
(NSString
*)sex age :
(NSInteger)age
height : (CGFloat)height;

+ (id)girlWithGirlFriend
: (NSString
*)name sex :
(NSString
*)sex age :
(NSInteger)age
height : (CGFloat)height;

@end

Girl.m
@implementation
Girl
//当属性生成的setter和getter方法的实现,不满足你的需求时,可以重写setter和getter方法
//当完全重写setter和getter方法时,@synthesize name=
_name;,就是实效的
   
   解决问题的方法
   
 1.只重写setter和getter 方法中的一个
 
   2.自己添加@synthesize name=
_name;
@synthesize
name=
_name;

- (void)setName:(NSString
*)name

{

   
NSLog(@"你好小姐");

//   
_name = name;
//   
self.name = name; 
//self.name == [self setNane : name];

   

//           
NSLog(@"%@",self.name);
     
//self.name == [self name];

           
_name
=
name;

}
-
(NSString
*)name{
//   
return self.name
error!!!   [self name];  
   (2)ERROR!!!
 

   
return
_name;

}
++++++方法内部是不能用方法调用自己++++++

//-
(void)sayHi{
//   
NSLog(@"小仓");
//   
[self sayHi];

//}
     
     
     
     
     
     
     
     
     
     
     
      ( 3)
ERROR!!!
//初始化和遍历构造器方法
-
(id)initWithGirlFriend
: (NSString
*)name sex :
(NSString
*)sex age :
(NSInteger)age
height : (CGFloat)height{

if
(self
=
[super
init])
{

       
_name
=
name;

       
_sex
=
sex;

       
_age=
age;

       
_height
=
height;

    }

   
return
self;

}

+ (id)girlWithGirlFriend
: (NSString
*)name sex :
(NSString
*)sex age :
(NSInteger)age
height : (CGFloat)height{

return
[[Girl
alloc]initWithGirlFriend:name
sex:sex
age:age
height:height];

}
//description方法
-
(NSString
*)description

{

   
return
[NSString
stringWithFormat:@"%@-%@-%ld-%.2lf",
_name,_sex,_age,_height];

}
--------------------------------------------------------------------
//第知识点KVC  Key-Value-Coding
键值编码  例题中的调用部分
-
(void)setValue:(id)value
forUndefinedKey:(NSString
*)key{

   
NSLog(@"没有在Girl类中找到此key值");

}

- (id)valueForUndefinedKey:(NSString
*)key{

   
return
nil;

}
@end

main.m
Girl
*g
= [Girl
girlWithGirlFriend:@"如花"
sex:@"yao"
age:28
height:175.6];
   
NSLog(@"%@",g);
   
g.name
=
@"翠花";
   
NSLog(@"%@",g.name);
====================================================
3、 KVC 
Key-Value-Coding 键值编码
通过KVC访问实例变量,是一种间接访问实例变量的形式
例子:
Man.h
@class
Girl;

@interface
Man :
NSObject

{

   
NSString
*_name;

}
@property(nonatomic,retain)Girl
*girlFriend;

//@property
(nonatomic,copy)NSString *name; //做例子实例变量
@property
(nonatomic,assign)NSInteger
age;



- (id)initWithName
: (Girl
*)girlFriend
name : (NSString
*)name 
age : (NSInteger)age;

+ (id)manWithName
: (Girl
*)girlFriend 
name : (NSString
*)name 
age : (NSInteger)age;

@end

Man.m
#import
"Man.h"

#import "Girl.h"

@implementation
Man
//实现初始化方法
-
(id)initWithName
: (Girl
*)girlFriend 
name : (NSString
*)name 
age : (NSInteger)age{

if
(self
=
[super
init])
{

       
_girlFriend
=
girlFriend;

       
_age
=
age;

       
_name
=
name;

    }

   
return
self;

}
//实现遍历构造器方法
+
(id)manWithName
: (Girl
*)girlFriend
name : (NSString
*)name 
age : (NSInteger)age{

return
[[Man
alloc]initWithName:girlFriend
name:name
age:age];

}

- (NSString
*)description

{

   
return
[NSString
stringWithFormat:@"%@-%@-%ld",
_girlFriend,_name,_age];

}
------------------------------------------------
//防止没有找到对应的key值而引起的Crash
-
(void)setValue:(id)value
forUndefinedKey:(NSString
*)key
 //容易打错
{

   
NSLog(@"哈哈,没有找到对应key值");

}

//防止没有找到对应的key值而引起的Crash
-
(id)valueForUndefinedKey:(NSString
*)key{

   
return
nil;

}

@end

main.m
//通过key值去类中查找实例变量,先判断有没有实例变量name,若没有就赋值,如果没有接着判断有没有_name,如果有酒赋值
 
  Man
*man =
[[Man
alloc]init];
 
  [man setValue:@"妖"
forKey:@"name"];
   
NSLog(@"%@",[man
valueForKey:@"name"]);

[man
setValue:g
forKey:@"girlFriend"];

   
NSLog(@"%@",[man
valueForKey:@"girlFriend"]);

 
//想通过man这个对象给girl
这对象的名字赋值@"棉花"
 
[[man valueForKey:@"girlFriend"]
setValue:@"棉花"
forKey:@"name"];

//通过KVC把棉花打印出来

NSLog(@"%@",[[man
valueForKey:@"girlFriend"]valueForKey:@"name"]);

//KVC通过路径赋值取值(即使没有是实现setter
和 getter 方法也可以通过KVC赋值和取值)

    [man
setValue:@"棉花糖"
forKeyPath:@"girlFriend.name"];

NSLog(@"%@",[[man
valueForKey:@"girlFriend"]valueForKey:@"name"]);

   
NSLog(@"%@",[man
valueForKeyPath:@"girlFriend.name"]);
总结:注意前三个例题中的ERROR!!!错误造成Crash!原因是造成递归显现!

 
     
     
 
 欢迎分享本文,未经许可,不得转载,转载请注明出处!

Property属性, KVC键值编码OC…的更多相关文章

  1. KVC - 键值编码

    [基本概念] 1.键值编码是一个用于间接访问对象属性的机制,使用该机制不需要调用存取方法和变量实例就可访问对象属性. 2.键值编码方法在OC非正式协议(类目)NSKeyValueCoding中被声明, ...

  2. iOS - KVC 键值编码

    1.KVC KVC 是 Key-Value Coding 的简写,是键值编码的意思,属于 runtime 方法.Key Value Coding 是 cocoa 的一个标准组成部分,是间接给对象属性设 ...

  3. Objective-C(十七、KVC键值编码及实例说明)——iOS开发基础

    结合之前的学习笔记以及參考<Objective-C编程全解(第三版)>,对Objective-C知识点进行梳理总结.知识点一直在变,仅仅是作为參考,以苹果官方文档为准~ 十七.键值编码 K ...

  4. 使用KVC键值编码

    掌握KVC从不使用setter.getter.点语法开始. ----- 前言 对象的内部状态是由属性进行封装的.访问对象属性的方式平时在开发过程中用得最多的是getter方法和点语法.键值编程KVC也 ...

  5. 09 (OC)* 键路径(keyPath)、键值编码(KVC)、键值观察(KVO)

    键路径在一个给定的实体中,同一个属性的所有值具有相同的数据类型.键-值编码技术用于进行这样的查找—它是一种间接访问对象属性的机制. - 键路径是一个由用点作分隔符的键组成的字符串,用于指定一个连接在一 ...

  6. ios中键值编码kvc和键值监听kvo的特性及详解

    总结: kvc键值编码  1.就是在oc中可以对属性进行动态读写(以往都是自己赋值属性)           2. 如果方法属性的关键字和需要数据中的关键字相同的话                  ...

  7. 路径(keyPath)、键值编码(KVC)和键值观察(KVO)

    键路径 在一个给定的实体中,同一个属性的所有值具有相同的数据类型. 键-值编码技术用于进行这样的查找—它是一种间接访问对象属性的机制. - 键路径是一个由用点作分隔符的键组成的字符串,用于指定一个连接 ...

  8. 《苹果开发之Cocoa编程》键-值编码和键-值观察

    一.KVC 键-值编码(Key - Value Coding, KVC)是通过变量名的读取和设置变量值的一种方法,将字符串的变量名作为key来引用.NSObject定义了两个方法(KVC方法)用于变量 ...

  9. [原创]obj-c编程16:键值编码(KVC)

    原文链接:obj-c编程16:键值编码(KVC) 我们可以借助obj-c中的键值编码(以后简称KVC,Key-Value Coding)来存取类的属性,通过指定所要访问的属性名字符串标示符,可以使用存 ...

随机推荐

  1. python学习之路网络编程篇(第四篇)

    python学习之路网络编程篇(第四篇) 内容待补充

  2. oracle查询相关语句

    1,查询表空间使用情况select a.a1 表空间名称,c.c2 类型,c.c3 区管理,b.b2/1024/1024 表空间大小M,(b.b2-a.a2)/1024/1024 已使用M,subst ...

  3. A quike guide teaching you how to use matlab to read netCDF file and plot a figure

    1.       Preparation 2.       A brief introduce to netCDF. 4 3.       Data Structure. 4 3.1   Attrib ...

  4. ACM Find them, Catch them

    The police office in Tadu City decides to say ends to the chaos, as launch actions to root up the TW ...

  5. day08 JSP

    day08 JSP 1. jsp 入门和 jsp 运行原理 2. jsp 语法 2.1 jsp 模板元素:jsp 页面中的 html 内容.它定义了网络基本骨架,即定义了页面结构和外观. 2.2 js ...

  6. 安卓高级9 用原生intent分享

    大家都用过安卓app时发现有个分享按钮如下: 所以今天特此分享用用原生完成: package qianfeng.com.simplesharedemo; import android.content. ...

  7. [转]django-registration quickstart

    Basic configuration and use--------------------------- Once installed, you can add django-registrati ...

  8. android 网络工具 之Android-Volley的demo

    1.今天详细的研究了Volley的使用,下面来给大家介绍一下: Android Volley 是Google开发的一个网络lib,可以让你更加简单并且快速的访问网络数据.Volley库的网络请求都是异 ...

  9. Linux命令—压缩及其他

     (1)为了更好的传送和保存文件,需要对某些文件和目录进行压缩和解压缩操作,Linux 提供了强大的压缩.解压缩命令,常用的tar命令. (2)在Linux中,如果要使用储存设备(硬盘.光驱.移动 ...

  10. 剑指Offer——银行考试

    剑指Offer--银行考试 网申简历 一. 银行网申简历主要看哪些方面? 1.职业形象(30%),基本体现为证件照: 2.学校+成绩+校内表现(40%),体现为证书,成绩排名以及任职经历等: 3.校外 ...