博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Encapsulating Data 数据封装
阅读量:6413 次
发布时间:2019-06-23

本文共 2189 字,大约阅读时间需要 7 分钟。

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

转载地址:http://arbra.baihongyu.com/

你可能感兴趣的文章
7. Spring Boot 启动加载数据 CommandLineRunner
查看>>
请问两个div之间的上下距离怎么设置
查看>>
java 使用反射
查看>>
20181204-2 Final发布
查看>>
性能测试初学_loadrunner脚本增强
查看>>
办公室局域网访问共享文件夹
查看>>
SVN学习笔记
查看>>
几种PCB软件
查看>>
51nod1160 压缩算法的矩阵——一道有趣的题
查看>>
python基础:os模块中关于文件/目录常用的函数使用方法
查看>>
python3.4 百度API接口
查看>>
移植cjson到windows下编译
查看>>
5 . 3 执 行 引 擎
查看>>
tf.Variable
查看>>
dede全功能手册V5.3
查看>>
架构师入门ing
查看>>
[UOJ218]火车管理
查看>>
Android -- 自定义View(一)
查看>>
dp - HNU 13404 The Imp
查看>>
day29 类中的内置函数方法 __str__ __repr__ __call__ isinstance() issubclass()
查看>>