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)来存取类的属性,通过指定所要访问的属性名字符串标示符,可以使用存 ...
随机推荐
- merge into的用法及10g新特性总结
merge into 的作用: 将源数据(来源于实际的表,视图,子查询)更新或插入到指定的表中(必须实际存在),依赖于on条件,好处是避免了多个insert 和update操作. merge是一个目标 ...
- Win7 环境下虚拟机内 Samba 服务器的安装、配置以及与主机的通信实现
考虑到window和linux虚拟机之间互传文件较为麻烦,遂打算在虚拟机中安装Samba服务器,以此实现共享文件给window使用.然而安装配置过程曲折,遂作记录如下: 一.samba服务器的安装 正 ...
- Java第9次实验(网络)
参考资料 本次作业参考文件 正则表达式参考资料 注:主要根据实验任务书的指导完成本次实验. 第1次实验 1. 网络基础 ipconfig.ping telnet(连接BBS与连接Web服务器的不同) ...
- 初识mybatis(二)
上篇博客我们介绍通过Java代码来创建mybatis的配置文件,港真,这种方式看起来有意思实际在开发中用的并不多,mybatis的配置还是以xml配置为主,本文我们就来看看如何通过xml文件来配置my ...
- lucene创建索引
创建索引. 1.lucene下载. 下载地址:http://archive.apache.org/dist/lucene/java/. lucene不同版本之间有不小的差别,这里下载的是lucene ...
- GC对象分配规则
1.对象优先分配在Eden区,如果Eden区没有足够的空间时,虚拟机执行一次Minor GC. 2.大对象直接进入老年代(大对象是指需要大量连续内存空间的对象).这样做的目的是避免在Eden区和两个S ...
- Visual Studio 写自己的动态链接库(DLL)
有些时候,我们想写自己的函数库以避免重复写代码,此文介绍如何使用Visual Studio编写自己的动态链接库. 0,实验环境说明: 集成开发环境:Visual Studio 10.0 操作系统: W ...
- iOS 滚动视图的复用问题解决方案
LazyScroll是什么 LazyScrollView 继承自ScrollView,目标是解决异构(与TableView的同构对比)滚动视图的复用回收问题.它可以支持跨View层的复用,用易用方式来 ...
- 用scheme最基本的元素定义排序函数
用到的元素有9个: define,if,null?,cons car,cdr,lambda,let,named let, 其实let 和 named let可以去掉.但那样会带来性能和可读性下降的问题 ...
- JAR、WAR、EAR的使用和区别
最近接触这几个词较多,停下来总结总结它们的区别和联系,更好的深刻理解 Jar.war.EAR.在文件结构上,三者并没有什么不同,它们都采用zip或jar档案文件压缩格式.但是它们的使用目的有所区别: ...