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. merge into的用法及10g新特性总结

    merge into 的作用: 将源数据(来源于实际的表,视图,子查询)更新或插入到指定的表中(必须实际存在),依赖于on条件,好处是避免了多个insert 和update操作. merge是一个目标 ...

  2. Win7 环境下虚拟机内 Samba 服务器的安装、配置以及与主机的通信实现

    考虑到window和linux虚拟机之间互传文件较为麻烦,遂打算在虚拟机中安装Samba服务器,以此实现共享文件给window使用.然而安装配置过程曲折,遂作记录如下: 一.samba服务器的安装 正 ...

  3. Java第9次实验(网络)

    参考资料 本次作业参考文件 正则表达式参考资料 注:主要根据实验任务书的指导完成本次实验. 第1次实验 1. 网络基础 ipconfig.ping telnet(连接BBS与连接Web服务器的不同) ...

  4. 初识mybatis(二)

    上篇博客我们介绍通过Java代码来创建mybatis的配置文件,港真,这种方式看起来有意思实际在开发中用的并不多,mybatis的配置还是以xml配置为主,本文我们就来看看如何通过xml文件来配置my ...

  5. lucene创建索引

    创建索引. 1.lucene下载. 下载地址:http://archive.apache.org/dist/lucene/java/. lucene不同版本之间有不小的差别,这里下载的是lucene ...

  6. GC对象分配规则

    1.对象优先分配在Eden区,如果Eden区没有足够的空间时,虚拟机执行一次Minor GC. 2.大对象直接进入老年代(大对象是指需要大量连续内存空间的对象).这样做的目的是避免在Eden区和两个S ...

  7. Visual Studio 写自己的动态链接库(DLL)

    有些时候,我们想写自己的函数库以避免重复写代码,此文介绍如何使用Visual Studio编写自己的动态链接库. 0,实验环境说明: 集成开发环境:Visual Studio 10.0 操作系统: W ...

  8. iOS 滚动视图的复用问题解决方案

    LazyScroll是什么 LazyScrollView 继承自ScrollView,目标是解决异构(与TableView的同构对比)滚动视图的复用回收问题.它可以支持跨View层的复用,用易用方式来 ...

  9. 用scheme最基本的元素定义排序函数

    用到的元素有9个: define,if,null?,cons car,cdr,lambda,let,named let, 其实let 和 named let可以去掉.但那样会带来性能和可读性下降的问题 ...

  10. JAR、WAR、EAR的使用和区别

    最近接触这几个词较多,停下来总结总结它们的区别和联系,更好的深刻理解 Jar.war.EAR.在文件结构上,三者并没有什么不同,它们都采用zip或jar档案文件压缩格式.但是它们的使用目的有所区别: ...