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 数据封装的更多相关文章

  1. Encapsulating Data

    [Encapsulating Data] The synthesized methods follow specific naming conventions: The method used to ...

  2. Programming with Objective-C ----------Encapsulating Data

    Most Properties Are Backed by Instance Variables By default, a readwrite property will be backed by ...

  3. 《Programming with Objective-C》第四章 Encapsulating Data

    Designated Initializer 不稳定的传送门 合成属性 Properties don’t always have to be backed by their own instance ...

  4. Programming With Objective-C---- Encapsulating Data ---- Objective-C 学习(三) 封装数据

      Programming with Objective-C Encapsulating Data In addition to the messaging behavior covered in t ...

  5. iOS Developer Libray (中文版)-- About Objective-C

    该篇是我自己学习iOS开发时阅读文档时随手记下的翻译,有些地方不是很准确,但是意思还是对的,毕竟我英语也不是很好,很多句子无法做到准确的字词翻译,大家可以当做参考,有错误欢迎指出,以后我会尽力翻译的更 ...

  6. 为什么要在游戏开发中使用ECS模式

    http://www.richardlord.net/blog/why-use-an-entity-framework Why use an entity system framework for g ...

  7. 《Programming with Objective-C》

    苹果官方文档:不稳定的传送门 读书笔记共有以下几篇,其他的知识点不重要或者已经熟悉不需记录 <Programming with Objective-C>第三章 Working with O ...

  8. [转载]NoSQL by Martin Flower

    ============================================================== URL1 nosql ========================== ...

  9. 采用现代Objective-C

    多年来,Objective-C语言已经有了革命性的发展.虽然核心理念和实践保持不变,但语言中的部分内容经历了重大的变化和改进.现代化的Objective-C在类型安全.内存管理.性能.和其他方面都得到 ...

随机推荐

  1. Android 7.0 出现 ”FileUriExposedException“ 和 ”解析包出现错误“ 异常的解决办法

    问题1 :android.os.FileUriExposedException: file:///storage/emulated/0/Android/data/com.xxx.xxx.xxx.rel ...

  2. HTML5学习笔记(二十四):DOM扩展

    DOM扩展 DOM标准扩展最开始都是来自各个浏览器的自定义扩展DOM的功能,后被收录为标准的DOM相关API. 本笔记只记录被各大浏览器支持的标准扩展,对于特定浏览器的专有扩展不讨论. 选择符API ...

  3. 【小白的CFD之旅】26 何为收敛

        小白最近对流体计算的收敛产生了困惑.以前在学习高等数学的时候,小白接触过了级数的收敛,由于当时贪玩,并未将其放在心上,因此大学结束了小白也只是记住有这么一个名词罢了.现如今在利用CFD的过程中 ...

  4. 按键精灵与逍遥安卓ADB连接重键方法

    1.按键精灵与逍遥安卓ADB连接安装按键精灵与逍遥安卓这两个软件我不用多说了.安装好后把逍遥安卓安装目录下的三个文件adb.exe,AdbWinApi.dll,AdbWinUsbApi.dll 全部复 ...

  5. C++ STL set和multiset的使用

    C++ STL set和multiset的使用 std::set<int> s;那个s这个对象里面存贮的元素是从小到大排序的,(因为用std::less作为比较工具.) 1,set的含义是 ...

  6. 白话 Ruby 与 DSL 以及在 iOS 开发中的运用

    每日一篇优秀博文 2017年10月7日 周六 白话 Ruby 与 DSL 以及在 iOS 开发中的运用 阅读本文不需要预先掌握 Ruby 与 DSL 相关的知识 何为 DSL DSL(Domain S ...

  7. (原)docker的一个“Driver aufs failed to remove...”问题的解决

    1.  /var/lib/docker/aufs/mnt下的目录不能乱删! /var/lib/docker/aufs/diff下的目录删了就死了!!!!!2. 尽量不要用docker tag -f 这 ...

  8. 安装pydiction

    pydiction用来实现代码补全和语法提示功能.pydiction不能通过apt安装,需要自行下载安装. 在GitHub下载源码,可以使用Git迁出到本地,或者下载zip包自行解压,地址为:http ...

  9. Android开发(七)——判断网络状态

    项目中难免会出现使用网络的情况,使用网络前得进行网络判断,看网上的网友一般有多种实现版本. 第一种: // 是否有网络连接 public static boolean isNetworkConnect ...

  10. git拉取远程分支

    查看本地所有分支列表: git branch -a 查看远程所有分支列表: git branch -r 拉取远程分支(使用该方式会在本地新建分支x,但是不会自动切换到该本地分支x,需要手动checko ...