Property属性, KVC键值编码OC…
和 getter 方法
属性的声明:(写在.h中)
格式: @property 数据类型 属性名
属性的实现:(写在.m中)
格式: @synthesize 属性名:
@property NSString *gender;
person.gender = @"妖";
NSLog(@"%@",person.gender);//点语法
NSLog(@"%@",[person
gender]);//setter、getter方法
Teacher
: NSObject
NSString
*name,*color;
@property
NSInteger
age;
score;
name,color,age,score;
和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];//这样是可以的
2.实现可以省略实例变量的声明(系统自动帮你生成属性名 加下划线的实例变量
如:_name)
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);
主要用来控制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 新名字
gender
自定义初始化方法
遍历构造器方法
重写description
方法
Boy :
NSObject
//属性修饰符可以写多个,每一个修饰符之间用逗号隔开
//系统默认readwrite
,平时可以不写
@property
(nonatomic,copy,readwrite,setter=setAAA:,getter=AAA)NSString
*name;
@property
(atomic,copy,readwrite)NSString
*gender;
(nonatomic,assign,readonly)NSInteger
age;
(nonatomic,assign,readwrite,getter=isFalg)BOOL
flag;
使用属性可以不写实现部分
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);
name,sex,age,height,写属性的属性,自定义初始化方法,便利构造器方法,重写description方法
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;
Girl
//当属性生成的setter和getter方法的实现,不满足你的需求时,可以重写setter和getter方法
_name;,就是实效的
解决问题的方法
1.只重写setter和getter 方法中的一个
2.自己添加@synthesize name=
_name;
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];
(NSString
*)description
{
return
[NSString
stringWithFormat:@"%@-%@-%ld-%.2lf",
_name,_sex,_age,_height];
键值编码 例题中的调用部分
(void)setValue:(id)value
forUndefinedKey:(NSString
*)key{
NSLog(@"没有在Girl类中找到此key值");
}
- (id)valueForUndefinedKey:(NSString
*)key{
return
nil;
*g
= [Girl
girlWithGirlFriend:@"如花"
sex:@"yao"
age:28
height:175.6];
NSLog(@"%@",g);
g.name
=
@"翠花";
NSLog(@"%@",g.name);
Key-Value-Coding 键值编码
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;
"Man.h"
#import "Girl.h"
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];
(void)setValue:(id)value
forUndefinedKey:(NSString
*)key
//容易打错
NSLog(@"哈哈,没有找到对应key值");
}
(id)valueForUndefinedKey:(NSString
*)key{
return
nil;
}
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"]);
欢迎分享本文,未经许可,不得转载,转载请注明出处!
Property属性, KVC键值编码OC…的更多相关文章
- KVC - 键值编码
[基本概念] 1.键值编码是一个用于间接访问对象属性的机制,使用该机制不需要调用存取方法和变量实例就可访问对象属性. 2.键值编码方法在OC非正式协议(类目)NSKeyValueCoding中被声明, ...
- iOS - KVC 键值编码
1.KVC KVC 是 Key-Value Coding 的简写,是键值编码的意思,属于 runtime 方法.Key Value Coding 是 cocoa 的一个标准组成部分,是间接给对象属性设 ...
- Objective-C(十七、KVC键值编码及实例说明)——iOS开发基础
结合之前的学习笔记以及參考<Objective-C编程全解(第三版)>,对Objective-C知识点进行梳理总结.知识点一直在变,仅仅是作为參考,以苹果官方文档为准~ 十七.键值编码 K ...
- 使用KVC键值编码
掌握KVC从不使用setter.getter.点语法开始. ----- 前言 对象的内部状态是由属性进行封装的.访问对象属性的方式平时在开发过程中用得最多的是getter方法和点语法.键值编程KVC也 ...
- 09 (OC)* 键路径(keyPath)、键值编码(KVC)、键值观察(KVO)
键路径在一个给定的实体中,同一个属性的所有值具有相同的数据类型.键-值编码技术用于进行这样的查找—它是一种间接访问对象属性的机制. - 键路径是一个由用点作分隔符的键组成的字符串,用于指定一个连接在一 ...
- ios中键值编码kvc和键值监听kvo的特性及详解
总结: kvc键值编码 1.就是在oc中可以对属性进行动态读写(以往都是自己赋值属性) 2. 如果方法属性的关键字和需要数据中的关键字相同的话 ...
- 路径(keyPath)、键值编码(KVC)和键值观察(KVO)
键路径 在一个给定的实体中,同一个属性的所有值具有相同的数据类型. 键-值编码技术用于进行这样的查找—它是一种间接访问对象属性的机制. - 键路径是一个由用点作分隔符的键组成的字符串,用于指定一个连接 ...
- 《苹果开发之Cocoa编程》键-值编码和键-值观察
一.KVC 键-值编码(Key - Value Coding, KVC)是通过变量名的读取和设置变量值的一种方法,将字符串的变量名作为key来引用.NSObject定义了两个方法(KVC方法)用于变量 ...
- [原创]obj-c编程16:键值编码(KVC)
原文链接:obj-c编程16:键值编码(KVC) 我们可以借助obj-c中的键值编码(以后简称KVC,Key-Value Coding)来存取类的属性,通过指定所要访问的属性名字符串标示符,可以使用存 ...
随机推荐
- 第一篇博客 ---- 分享关于Maven使用的一些技巧
Maven环境搭建 在官网上下载maven安装包,地址:http://maven.apache.org/download.cgi . 解压文件到电脑坐在盘符目录,如E:\apache-maven-3. ...
- 再见,segmentfault
再见,segmentfault 太多的Bug,对segmentfault已经爱不起了. 重回博客园~
- Java内存泄漏分析系列之一:使用jstack定位线程堆栈信息
原文地址:http://www.javatang.com 前一段时间上线的系统升级之后,出现了严重的高CPU的问题,于是开始了一系列的优化处理之中,现在将这个过程做成一个系列的文章. 基本概念 在对J ...
- Bootstrap3 排版-标题
HTML 中的所有标题标签,<h1> 到 <h6> 均可使用.另外,还提供了 .h1 到 .h6 类,为的是给内联(inline)属性的文本赋予标题的样式. h1. Boots ...
- Dynamics CRM2016 Web API之Use custom FetchXML
CRM2016中新增的web api支持fetch xml了,之前使用FetchXML的场景是在后天代码中通过组织服务的retrieve multiple方法,但实际的应用效果有多大,还需要在实际的项 ...
- 剑指offer-面试题7:俩个栈实现队列(java)
详细分析请参照C语言版,这里仅仅给出实现代码,注释很详细,不得不说java各种api用起来真是爽飞了 1 package com.xsf.SordForOffer; 2 3 import java.u ...
- ASCII 大文字生成器
display text in large ASCII art fonts 显示大ASCII艺术字体 这种东西在源码声明或者软件初始化控制台打印时候很有用. 例如打开: http://www.oran ...
- linuxsvn源代码版本库建立
linuxsvn源代码版本库建立 下面就要建立代码的版本库做描述: 1. 安装svn版本服务器端 yum install subversion 从镜像下载安装svn服务器端,我们服务器已经安装 ...
- UNIX网络编程——原始套接字的魔力【续】
如何从链路层直接发送数据帧 上一篇里面提到的是从链路层"收发"数据,该篇是从链路层发送数据帧. 上一节我们主要研究了如何从链路层直接接收数据帧,可以通过bind函数来将原始套接字绑 ...
- C控制台实现模拟平抛运动算法
平抛运动这个相信读了高中物理都知道这个概念了,详细的我就不说了,不明白的看看百度: 平抛运动 接下来看看用控制台实现的平抛运动算法: #include <stdio.h> #include ...