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)来存取类的属性,通过指定所要访问的属性名字符串标示符,可以使用存 ...
随机推荐
- Docker常见仓库MySQL
MySQL 基本信息 MySQL 是开源的关系数据库实现. 该仓库提供了 MySQL 各个版本的镜像,包括 5.6 系列.5.7 系列等. 使用方法 默认会在 3306 端口启动数据库. $ sudo ...
- Java语言程序设计-助教篇
1. 给第一次上课(软件工程)的老师与助教 现代软件工程讲义 0 课程概述 给学生:看里面的第0个作业要求 2. 助教心得 美国视界(1):第一流的本科课堂该是什么样?(看里面的助教部分) 助教工作看 ...
- Spring中@Transactional事务回滚(含实例详细讲解,附源码)
一.使用场景举例 在了解@Transactional怎么用之前我们必须要先知道@Transactional有什么用.下面举个栗子:比如一个部门里面有很多成员,这两者分别保存在部门表和成员表里面,在删除 ...
- Dubbo框架应用之(一)--服务体系
Dubbo 是阿里巴巴公司开源的一个高性能优秀的服务框架,使得应用可通过高性能的 RPC 实现服务的输出和输入功能,可以和 Spring框架无缝集成,也是一个非常全面的SOA基础框架.其是阿里巴巴SO ...
- Linux-2.6.25 TCPIP函数调用大致流程
插口层系统调用send sys_send sys_sendtosendto sys_sendto sock_sendmsgsendmsg sys_send ...
- RxJava操作符(09-算术/聚合操作&连接操作)
转载请标明出处: http://blog.csdn.net/xmxkf/article/details/51692493 本文出自:[openXu的博客] 目录: 算术聚合 Count Concat ...
- Gazebo機器人仿真學習探索筆記(七)连接ROS
中文稍后补充,先上官方原版教程.ROS Kinetic 搭配 Gazebo 7 附件----官方教程 Tutorial: ROS integration overview As of Gazebo 1 ...
- apply函数用法
procedure: (apply proc arg1 ... args) Proc must be a procedure and args must be a list. Calls proc ...
- Android必知必会-发布开源 Android 项目注意事项
如果移动端访问不佳,请使用 –> Github版 1. 合理配置 .gitignore 文件 配置 .gitignore 可以排除一些非必要文件和保护保密信息,下面是在项目根目录下 .gitig ...
- Tomcat中的ssl安全信道的实现
为了实现https协议通信,tomcat需要利用JSSE把SSL/TLS协议集成到自身系统上,通过上一节我们知道不同的厂商可以实现自己的JSSE,而tomcat默认使用的是以前sun公司开发实现的包而 ...