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. 第一篇博客 ---- 分享关于Maven使用的一些技巧

    Maven环境搭建 在官网上下载maven安装包,地址:http://maven.apache.org/download.cgi . 解压文件到电脑坐在盘符目录,如E:\apache-maven-3. ...

  2. 再见,segmentfault

    再见,segmentfault 太多的Bug,对segmentfault已经爱不起了. 重回博客园~

  3. Java内存泄漏分析系列之一:使用jstack定位线程堆栈信息

    原文地址:http://www.javatang.com 前一段时间上线的系统升级之后,出现了严重的高CPU的问题,于是开始了一系列的优化处理之中,现在将这个过程做成一个系列的文章. 基本概念 在对J ...

  4. Bootstrap3 排版-标题

    HTML 中的所有标题标签,<h1> 到 <h6> 均可使用.另外,还提供了 .h1 到 .h6 类,为的是给内联(inline)属性的文本赋予标题的样式. h1. Boots ...

  5. Dynamics CRM2016 Web API之Use custom FetchXML

    CRM2016中新增的web api支持fetch xml了,之前使用FetchXML的场景是在后天代码中通过组织服务的retrieve multiple方法,但实际的应用效果有多大,还需要在实际的项 ...

  6. 剑指offer-面试题7:俩个栈实现队列(java)

    详细分析请参照C语言版,这里仅仅给出实现代码,注释很详细,不得不说java各种api用起来真是爽飞了 1 package com.xsf.SordForOffer; 2 3 import java.u ...

  7. ASCII 大文字生成器

    display text in large ASCII art fonts 显示大ASCII艺术字体 这种东西在源码声明或者软件初始化控制台打印时候很有用. 例如打开: http://www.oran ...

  8. linuxsvn源代码版本库建立

    linuxsvn源代码版本库建立 下面就要建立代码的版本库做描述: 1.     安装svn版本服务器端 yum install subversion 从镜像下载安装svn服务器端,我们服务器已经安装 ...

  9. UNIX网络编程——原始套接字的魔力【续】

    如何从链路层直接发送数据帧 上一篇里面提到的是从链路层"收发"数据,该篇是从链路层发送数据帧. 上一节我们主要研究了如何从链路层直接接收数据帧,可以通过bind函数来将原始套接字绑 ...

  10. C控制台实现模拟平抛运动算法

    平抛运动这个相信读了高中物理都知道这个概念了,详细的我就不说了,不明白的看看百度: 平抛运动 接下来看看用控制台实现的平抛运动算法: #include <stdio.h> #include ...