Objective-C 快速入门--基础(五)
1、什么是属性?属性会帮我们做哪些事情?请详细说明。
(1)①属性是Objective-C 2.0定义的语法,为实例变量提供了setter、getter方法的默认实现;②能在一定程度上简化程序代码,并且增强实例变量的访问安全性。
(2)①属性会对于你声明的实例变量,它会默认帮你补齐你所需要的(你没有声明的,或者你没有实现的)getter,setter方法;②如果你不满意系统默认生成的getter,setter方法 需要同时重写一个实例变量的getter,setter方法,这时就需要注明 @synthesize 然后用实例变量去赋值属性名 // name = _name 不要写反。
2、什么是Attribute?属性的Attribute有几大类?都有什么作用?
(1)Objective-C提供属性的目的是为了简化程序员编码,并且为属性提供了一些关键字用以控制setter、getter的实现细节,这些关键字我们称为属性的属性(Attribute);
(2)一共3大类Attribute;
(3)第一类:读写性控制(readonly、readwrite、setter、getter)
①readonly,告诉编译器,只声明getter方法(无setter方法)。
例如:@property(readonly)NSString *name; //等价于:- (NSString *)name;
②readwrite,告诉编译器,既声明setter又声明getter。
例如: @property(readwrite)NSString *name; //等价于:- (void)setName:(NSString *)name; - (NSString *)name;
③readwrite是读写性控制的默认设置。
第二类:原子性控制(nonatomic、atomic)
①atomic:setter、getter方法在多线程访问下是绝对安全的,即 setter、getter内部做了多线程访问处理(原子性控制的默认设置是 atomic);
②nonatomic:setter、getter方法内部不会做多线程访问处理,仅仅是普通的setter、getter方法;
注意:①程序开发过程中,setter、getter处处都在用,如果使用atomic,需要不断的对setter、getter加锁解锁以保证线程访问安全,会很占用系统资源,降低系统性能;
②通常设置为nonatomic,某些属性需要线程安全的时候,才定义为atomic。
例如:例如:@property (readwrite,nonatomic)NSString *name; //等价于:- (void)setName:(NSString *)name; - (NSString *)name;
第三类:语义设置(assign、retain、copy)
①assign。setter、getter内部实现是直接赋值。
示例:例如:@property(nonatomic,assign)int age;
②retain。setter、getter的内部实现会做内存优化。
示例:例如:@property(nonatomic,retain)NSString *name;
③copy。setter、getter的内部实现也会做内存优化。
示例:例如:@property(nonatomic,copy)NSString *name;
提示:①如果属性是非对象类型(比如int,float等)属性的语义设置使用assign;
②如果属性是对象类型(比如NSStrng、NSArray等)属性的语义设置使用retain;
③如果属性是对象类型并且想得到参数的copy,使用copy关键字。
3、要想使用点语法必须要满足什么条件?
凡是符合系统默认setter、getter书写格式的方法都可以使用点语法。
例如:[person setName:@"zhangsan"]; 可以等价写成 person.name = @"zhangsan";
NSString *name = [person1 name]; 可以等价写成 NSString *name = person1.name;
4、使用点语法的实质就是在调用setter,getter方法.那什么时候是在调用setter方法,什么时候是在调用getter方法呢?
有赋值操作就是在调用setter方法, 没有赋值只是当做一个值使用的时候就是调用getter方法。
5、KVC的全称是什么?
KVC全称:(Key-Value-Coding),键值编码,是一种间接访问实例变量的方法。 key:键,用于标识实例变量;vlaue:实例变量对应的值。
6、在KVC中,给对象的一个实例变量赋值,用什么方法?
①普通键值:setValue:forKey:
②有层级关系的赋值:比如:学生的老师的女朋友 [stu tea.gf] 就用:setValue:forKeyPath:
7、在KVC中,如果在赋值或取值过程中,key所对应的实例变量不存在,执行的结果是什么?如何避免?
当key不存在 防止崩溃 就在对应的类.m文件中重写setter方法就用 setValue:forUndefinedKey:
示例:
8、在KVC中给一个对象的实例变量批量赋值采用什么方法?
批量赋值 把键值对存放在字典里 然后直接赋值字典 就用 setValuesForKeysWithDictionary:
Email:dingding3w@126.com
Objective-C 快速入门--基础(五)的更多相关文章
- Objective C 快速入门学习五
<一>继承和多态 @class Complex 声明类(同C++) 子类函数成员 super 访问父类 同C++类似 .通过继承 在子类中添加新方法 .通过继承 在子类中添加新成员 .通过 ...
- Scala快速入门 - 基础语法篇
本篇文章首发于头条号Scala快速入门 - 基础语法篇,欢迎关注我的头条号和微信公众号"大数据技术和人工智能"(微信搜索bigdata_ai_tech)获取更多干货,也欢迎关注我的 ...
- ELK快速入门(五)配置nginx代理kibana
ELK快速入门五-配置nginx代理kibana 由于kibana界面默认没有安全认证界面,为了保证安全,通过nginx进行代理并设置访问认证. 配置kibana [root@linux-elk1 ~ ...
- [SQL]SQL语言入门级教材_SQL语言快速入门(五)
SQL语言快速入门(一) SQL是英文Structured Query Language的缩写,意思为结构化查询语言. SQL语言的主要功能就是同各种数据库建立联系,进行沟通.按照ANSI(美国国家标 ...
- CSS快速入门基础篇,让你快速上手(附带代码案例)
1.什么是CSS 学习思路 CSS是什么 怎么去用CSS(快速上手) CSS选择器(难点也是重点) 网页美化(文字,阴影,超链接,列表,渐变等) 盒子模型 浮动 定位 网页动画(特效效果) 项目格式: ...
- Objective-C 快速入门--基础(二)
1.什么是继承?OC中的继承有哪些特点? “继承”是面向对象软件技术当中的一个概念.如果一个类A继承自另一个类B,就把这个A称为"B的子类",而把B称为"A的父类&quo ...
- Objective C 快速入门学习一
Objective-C程序设计 1. 直接用Xcode作为IDE,舍弃gcc编译方面的学习.2. 入门例子:Eg:打印Hello World 控制台程序 #import<Foundation/F ...
- 笔记65 Spring Boot快速入门(五)
SpringBoot+JPA 一.什么是JPA? JPA是Java Persistence API的简称,中文名Java持久层API,是JDK 5.0注解或XML描述对象-关系表的映射关系,并将运行期 ...
- Objective C 快速入门学习三
1.数据类型 和C语言基本一样. 有一个特别数据类型id,可以储存任何类型的对象,它是实现多态和动态绑定的基础. Objective-C 2.程序结构 Objective-C和C的程序结构一模一样,具 ...
随机推荐
- MVC5 网站开发实践 2.2、管理员身份验证
上次完成了管理员的登录,这次要解决对管理员登录后的验证,采用AuthorizeAttribute属性的方式.之前还要解决几个问题,然后才重写验证类,最后稍微改一下界面. 目录 MVC5 网站开发实践 ...
- android ANR产生原因和解决办法
转自http://blog.sina.com.cn/s/blog_618199e60101kvbl.html ANR (Application Not Responding) ANR定义:在Andro ...
- 深入理解javascript对象系列第三篇——神秘的属性描述符
× 目录 [1]类型 [2]方法 [3]详述[4]状态 前面的话 对于操作系统中的文件,我们可以驾轻就熟将其设置为只读.隐藏.系统文件或普通文件.于对象来说,属性描述符提供类似的功能,用来描述对象的值 ...
- Android探索之Service全面回顾及总结
什么是Service? Service(服务)是Android提供的四大组件之一,是一个没有用户界面的在后台运行执行耗时操作的应用组件.其他应用组件能够启动Service,并且当用户切换到另外的应用场 ...
- Why Namespace? - 每天5分钟玩转 OpenStack(102)
上一节我们讨论了 Neutron 将虚拟 router 放置到 namespace 中实现了不同 subnet 之间的路由.今天探讨为什么要用 namespace 封装 router? 回顾一下前面的 ...
- JavaScript变量声明提前
上周四吃完午饭,leader发了一道JavaScript的题目给我们做,我们Team里面有做前端的,有做后台的,也有做mobile web的,所以大家对题目的理解各自都不一样,然后在QQ讨论组里面进行 ...
- 国内版Office 365和Azure AAD绑定的问题及解决方案
背景: 1. 开发人员要做的事情,是希望在应用程序里面能调用Office 365 的API(Microsoft Graph)来动态添加Office 365账号 2. 如果需要调用这些API,必须在 ...
- ELF动态链接
为什么要使用动态链接? 在现代的linux系统中,假设一个普通的程序会使用到c语言静态库至少1MB以上,那么,如果我们的机器运行100个这样的程序,就用浪费近100MB的内存:如果磁盘有2000个这样 ...
- T-Sql(五)xml操作
t-sql中的xml操作在我们平时做项目的过程中用的很少,因为我们处理的数据量很少,除非一些用到xml的地方,t-sql中xml操作一般用在数据量很大,性能优化的地方,当然我在平时做项目的时候也是没用 ...
- c# 实现简单udp数据的发送和接收
服务端代码 static void Main(string[] args) { UdpClient client = null; string receiveString = null; byte[] ...