Encapsulating Data 数据封装
Objective-C中类的封装本质上其他OO语言没什么区别,不过在概念和书写表达上差异还是比较大的,
Property属性
这里的Property并不是简单的类成员变量,而是OC中特有的可以为编译器识别并自动生成取值函数的一个东西,可以理解为时加强的成员变量,他会自动生成getter、setter
@interface XYZPerson : NSObject |
@property NSString *firstName; |
@property NSString *lastName; |
@end |
比如在头文件中我们定义了NSString类型的姓、名两个指针变量,这里用property来写,可以免去我们写getter和setter的麻烦,效果和下面的写法一样
@interface XYZPerson : NSObject{ NSString *_firstName; NSString *_lastName; } |
-(NSString *)firstName; -(void)setFirstName:(NSString *)value; -(NSString *)lastName; -(void)setLastName:(NSString *)value; |
|
@end |
默认的情况下生成取值函数命名是有规律的,比如get函数和声明的名字相同,set函数则加上set前缀然后把声明的名字搜首字母大写,而对性的成员变量则是加一个_前缀,可以给property设置修饰的attribute属性来加约束,比如readonly只读,指定函数名字getter=XXX, setter=YYY:.
获取类成员既可以通过取值函数来操作,也可以用点语法,但是点语法不能用于readonly的property,
上面这些一般都是写在头文件中,如果不用property,我们还需要自己实现这些取值方法,一般在m文件内实现,在m文件中还可以通过synthesize来自定义property所对应的成员变量名字,默认是加下划线前缀_
@implementation YourClass |
@synthesize propertyName = instanceVariableName; |
... |
@end |
这样本来默认的应该是_propertyName, 现在变成instancevariableName,但是这样没什么意思,还是加上下划线来的清楚明了,否则两个名字对应一个东西很别扭,看到这你可能会觉得所有property都对应了另一个实际的成员变量,其实不是这样的。我们可以自己实现取值函数,而完全不需要成员变量:
@property (readonly) NSString *fullName; |
- (NSString *)fullName { |
return [NSString stringWithFormat:@"%@ %@", self.firstName, self.lastName]; |
} |
如果这里的fullname不是readonly,那么Xcode就会提示warning警告信息,Writeable atomic property cannot pair a synthesized setter with a user defined getter, 既然提示说不能生成setter,那么好办自己实现一个空的set方法,这样做是可以编译,虽然可行但是没多大意义,根据提示我们有三种修改方法,依旧是完全自己实现setter、getter,实际上相当于忽略property;二是加上nonatomic修饰property,应为默认是atomic,三就是不这样自己实现,还是然后全部系统生成
不论是点语法还是传统的取值方法,这些都是方便在类外面调用的,在类的内部可以直接用成员的名字,特别是在构造方法中。
提到构造方法,这里要啰嗦一下,不同于java,c++等,这里的构造函数不需要和类名一致,严格来说可以是任何合法的方法名,应为他也是一个方法,只不过我们在里面做一些初始化的操作,OC的类实例需要先分配内纯在初始化,所以经常看到[[XXX allc]initYYY]的写法,alloc是分配内纯后面的initYYY这是构造方法,习惯上以init为前缀跟上With,再加名字,读OC代码语句就像是读一段伪代码一样,可以看出语义,标注的构造方法应该形如一下:
- (id)init { |
self = [super init]; |
|
if (self) { |
// initialize instance variables here |
} |
|
return self; |
} |
还有一个就是避免强类型的环形引用,这很容易导致内存泄露,比如这张图,即使其他object对NSTableView河其委托的引用都释放了,内存也不会被释放。
所以我们经常看到Oulet是weak的,property可以直接用weak修饰,变量可以用__weak修饰,weak就是应用但不持有,当没count为零是自动变成nil,内纯可以被回收。
@property (weak) id delegate;
NSObject * __weak weakVariable;
Reference
- Encapsulating Data https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html
Encapsulating Data 数据封装的更多相关文章
- Encapsulating Data
[Encapsulating Data] The synthesized methods follow specific naming conventions: The method used to ...
- Programming with Objective-C ----------Encapsulating Data
Most Properties Are Backed by Instance Variables By default, a readwrite property will be backed by ...
- 《Programming with Objective-C》第四章 Encapsulating Data
Designated Initializer 不稳定的传送门 合成属性 Properties don’t always have to be backed by their own instance ...
- Programming With Objective-C---- Encapsulating Data ---- Objective-C 学习(三) 封装数据
Programming with Objective-C Encapsulating Data In addition to the messaging behavior covered in t ...
- iOS Developer Libray (中文版)-- About Objective-C
该篇是我自己学习iOS开发时阅读文档时随手记下的翻译,有些地方不是很准确,但是意思还是对的,毕竟我英语也不是很好,很多句子无法做到准确的字词翻译,大家可以当做参考,有错误欢迎指出,以后我会尽力翻译的更 ...
- 为什么要在游戏开发中使用ECS模式
http://www.richardlord.net/blog/why-use-an-entity-framework Why use an entity system framework for g ...
- 《Programming with Objective-C》
苹果官方文档:不稳定的传送门 读书笔记共有以下几篇,其他的知识点不重要或者已经熟悉不需记录 <Programming with Objective-C>第三章 Working with O ...
- [转载]NoSQL by Martin Flower
============================================================== URL1 nosql ========================== ...
- 采用现代Objective-C
多年来,Objective-C语言已经有了革命性的发展.虽然核心理念和实践保持不变,但语言中的部分内容经历了重大的变化和改进.现代化的Objective-C在类型安全.内存管理.性能.和其他方面都得到 ...
随机推荐
- mybatis 多数据源
<environments default="development"> <environment id="development"> ...
- 【Unity】第8章 GUI开发
分类:Unity.C#.VS2015 创建日期:2016-04-27 一.简介 前面的章节中实际上已经多次使用了GUI,只不过用法都比较简单,这一章系统地介绍Unity 5.x自带的GUI(称为Uni ...
- innobackupex在线备份及恢复(全量和增量)
Xtrabackup是由percona开发的一个开源软件,它是innodb热备工具ibbackup(收费的商业软件)的一个开源替代品.Xtrabackup由个部分组成:xtrabackup和innob ...
- .NET MVC结构框架下的微信扫码支付模式二 API接口开发测试
直接上干货 ,我们的宗旨就是为人民服务.授人以鱼不如授人以渔.不吹毛求疵.不浮夸.不虚伪.不忽悠.一切都是为了社会共同进步,繁荣昌盛,小程序猿.大程序猿.老程序猿还是嫩程序猿,希望这个社会不要太急功近 ...
- mysql 系统表的作用
mysql 的系统表记录了所有数据库表(包括视图的定义语句)的字段列,顺序,类型等等,知道这些的话可以做些抽取模板淫荡的操作吧 嘿嘿 public void shuaxinglb() { try { ...
- s3c2440代码重定位和段的引入——学以致用,综合Makefile的锻炼
对于2440而言,nand启动,nand的前4k内容由硬件复制到sram. nor flash,可以像内存一样读,但是不能像内存一样写,执行写操作需要特殊的操作. 程序中包含有需要写的全局或者静态变量 ...
- 自定义NSOperation下载图片
自定义NSOperation的话,只是需要将要下载图片的操作下载它的main方法里面,考虑到,图片下载完毕,需要回传到控制器里,这里可以采用block,也可以采用代理的方式实现,我采用的是代理的方式实 ...
- django 错误之 ImportError: No module named **
今天测试django的时候出了点问题,被坑惨了. D:\pythonCode\django\mysite>django-admin.py startproject mysite 然后创建APP ...
- virtualbox问题收集
The VM session was closed before any attempt to power it on. 返回 代码:E_FAIL (0x80004005)组件:SessionMach ...
- java二维码的生成与解析代码
二维码,是一种采用黑白相间的平面几何图形通过相应的编码算法来记录文字.图片.网址等信息的条码图片.如下图 二维码的特点: 1. 高密度编码,信息容量大 可容纳多达1850个大写字母或2710个数字或 ...