本文只针对一些OC初学或者即将面试IOS开发的朋友们,给一些对OC语言基础的总结,纯属个人理解,如果有错误还请指正~
对于刚接触IOS开发或者说Objective-C这门语言的童鞋们来说可能会有诸多的基础方面的问题,诸如#import到底是什么意思?这些也许你知道,但是你的回答不一定完全正确,现在就这些细节问题做一下个人的总结,便民啦~
1、#import与#include的问题
#import的作用跟C++里面的#include作用基本一样,都是引用头文件。但是不同的是你曾经会在C++的头文件里面写道#ifdef......#endif来防止头文件的重复引用,我们的#import就直接==#ifdef....#endif的#include了,这样说就明白了吧。自带防止重复引用的功能。
2、@property在做什么
顾名思义的话就不说了,通过写代码就能直接理解,加了@property的变量就相当于直接告诉系统这个东东已经需要有getter、setter方法了。我为什么不说getter和setter呢?因为@property内部还有参数,nonatomic与atomic是针对原子操作的,也就是说是否线程安全。asign就是赋值嘛,@property(asign)其实是唯一只针对基础变量类型的(如int、boolean什么的);retain就是最常用的,它会产生getter和setter,但是注意他的setter在内存中产生的只是一个指向变量所在地址的指针,而不是真正的变量,你或者可以叫他浅拷贝;与retain对应的copy,他的setter是产生一个一样的变量,并返回指向这个变量的地址,你可以叫他深拷贝;readonly就是说不产生setter,只有getter;readwrite就不用多说了,字面上跟readonly比较一下就理解了;strong与weak,把他俩放到一起说就是因为strong在开了ARC(自动垃圾回收机制)的情况下,本身是默认属性。这时候他跟retain是一样的,说白了想释放他不能 value = nil,他引用计数+1了,你必须使用release这类的。weak不会引用计数+1,这意味着你直接 value = nil,变量就真没了,例子可以自己去试,我就不贴了。
3、#pragma mark
这东西是写给Xcode的,方便你查看或查找函数信息,对你代码和编程没影响,对你阅读理解代码有很大的帮助。
4、category
OC里面没有多继承,但是你又想使用别的类里面的东西,再或者你对目前父亲类中的每个函数不满意,或者他没有你要用的函数(假设这时的父亲类为NSString,你没法进到里面新添加方法),这时候怎么办?Category就能解决这些问题,它相当于可以在class B中任意向其其父类class A中添加方法,如果方法重名,则覆盖使用,但是class A中的方法本身一点都没有变化。比如你希望NSString中有一个stringToJson的方法,你就可以使用category向NSString中添加这个方法,这样你的NSString变量就可以直接[string stringToJson]这么使用了。缺点:不能添加变量只能是方法;最好别跟原有的方法命名冲突了,否则你将无法使用以前的方法了。总结一点他就是不完全的delegate和protocol。
5、delegate和protocol
protocol其实跟java中的interface是同理不同名,他可以真正实现多继承,看OC的代码,你会发现一个类最多有一个父类,但是后面跟着一排protocol,要使用“干爹”的方法,尽情的protocol吧。
delegate跟protocol是一个性质,他的实现是基于protocol的,而且两者的使用也有很紧密的联系。网上说他的太多了,官方的说法就不多说了,我只是觉得他在跨类使用中很方便,A类中的数据或者某个事件需要传给B类处理或者让B类知道、或者需要触发B类的某个方法,就可以使用它。
6、KVC和KVO
这个东西我是用的也不是很多,但是确实很方便。先说KVO吧,字面意思是键值观察者,就是说当键值(你可以理解成某个对象的属性如user.passwd)变化的时候,他会触发一个消息/方法告诉开发者。而KVO是基于KVC(键值编码)实现的,你要使用KVC的写法,通过KVO来监视他,这个绝对是大白话了,具体可以去了看一下apple的开发文档~
第一次写,先写这么多了,后续继续总结一些个人对OC的理解(如block,还有线程什么的),我主要是想说明用来做什么的~
希望大家发现错误可以及时指正,共同进步,有问题可以留言~
作者只是一个大学狗而已,自学了点IOS开发,独立做过俩项目,这里斗胆乱说话介绍点个人经验,勿喷~