oc没有其他语言那种内置的命名空间机制。如果出现重名,就会发生命名冲突。若是发生重名冲突,那么应用程序相应的链接过程就会出错,运行文件不知道究竟该调用那个文件,因为其中出现了重复的符号。
“全能初始化方法”就是一个初始化方法,但是他的类创建对象的时候无论用什么初始化方法创建,其中代码都会调用某个初始化方法,那么这个初始化方法就是“全能初始化方法”。
到底该怎么初始化方法呢?
我们在调试程序的的时候经常要打印并查看对象信息。此时我们就可以用到description方法,其实description就是对这个对象本身的描述。
如
description方法会生成描述信息
如果是一个自定义的类,那么它就会输出该类的地址:
有时可能想修改封装在对象内部的数据,但是却不想令这些数据为外人所改动。这种情况下,通常的做法是在对象内部将readonly属性重新声明为readwrite。当然,如果该属性是nonatomic的,那么这样做可能会产生“竞争条件”,即在对象内部写入某属性时,对象外的观察者也许正读取该属性。若想避免此问题,我们可以在必要时通过“派发队列”等手段,将(包括对象内部的)所有数据存取操作都设为同步操作。
不要在返回的对象上查询类型以确定其是否可变。
如果方法的返口值是新创建的,那么方法名的首个词应是返回值的类型,除非前面还有修饰语,例如localizedString。属性的存取方法不遵循这种命名方式,因为一般认为这些方法不会创建新对象,即便有时返口内部对象的一份拷贝,我们也认为那相当手原有的对象。这些存取方法应该按照其所对应的属性来命名。
如果方法要在当前对象上执行操作,那么就应该包含动词;若执行操作时还需数,
则应该在动词后面加上一个或者多名词,不要使str这种简称,应该用 string 这样的全称。Boolean 属性应加is前级。如果某方法返口非属性的 Boolean 值,那么应该根据其功能,选用has 或is 当前缀。get这个前缀留给那些借由“输出” 参数,来保布返口值的方法
应该为类与协议的名称加上前缀,以避免命名空间冲突,而且应该像给方法起名时那样把词句组织好,使其从左至右读起来较为通顺。基本命名规则就是:命名方式应该一致,如果要从其他的类中继承子类,那么就要遵守其原本的命名惯例。
通常我们在写方法时,并没有对其进行私有共有分类,导致调试时可能很麻烦,现在为私有方法加上前缀,这样便于修改方法或方法签名。具体加什么来代表私有方法因人而异,自己怎么舒服怎么来,唯一注意的是:一定不要只使用_作为前缀,用p_都比那个好,因为苹果公司使用的就是_作为私有方法的前缀的,你自己定义的私有方法名有可能就会和人家自带的冲突。
“自动引用计数”在默认情况下不是“异常安全的”,就是说,如果抛出异常,那么本应该在作用域末尾释放的对象现在却不会释放了,这样就会造成内存泄漏问题,如果想生成“异常安全”的代码,可以通过设置编译器的标志来实现,不过这将引入一些额外的代码,在不抛出异常时,也照样要执行这部分代码。
OC语言现在所采用的办法是:只在极其罕见的情况下抛出异常,异常抛出之后,无须考虑恢复问题,而且应用程序此时也应该退出。这就是说,不用再编写复杂的“异常安全”代码了。在出现“不那么严重的错误”时,OC语言所用的编程范式为:令方法返回nil/0,或是使用NSError,以表明其中有错误发生。像我们之前都用过的网络请求,其中就使用到了NSError来表示错误。
第一种常见就是通过委托协议传递这个错误,当前对象会把协议中的某个方法传给委托的对象,此方法常用于API的设计。
另一种常见用法是:经由方法的“输出参数”返回给调用者。就是说用一个方法来判断你传过去的error是否真的有错误,返回Boolean值,之后你就可以根据error是否有内容,或者Boolean值来决定处理的代码和不处理的代码
还可以为error参数“解引用(error所指的那个指针现在要指向一个新的NSError对象)”之前,必须先保证error参数不是nil,因为空指针解引用会导致段错误并使程序崩溃,所以注意要判断error是不是nil。
使用对象时经常需要拷贝它。在oc中,此操作通过copy方法完成。如果想令自己的类支持拷贝操作,那就实现NSCopying协议。
- (id)copyWithZone:(NSZone *)zone;
为何会出现NSZone呢?
因为以前开发程序时,会据此把内存分成不同的“区”,而对象会创建在某个区里。现在不用了,每个程序只有一个区:“默认区”。所以说,尽管必须实现这个方法,到那时你不必担心其中的zone参数。
copy方法由NSObject实现,该方法只是以“默认区”为参数来调用“copyWithZone:”。
无论当前实例是否可变,若需获取其可变版本的拷贝,均应调用mutableCopy方法,同理,若需要不可变的拷贝,则总应通过copy方法来获取。
拷贝方法称为copy而非immutableCopy的原因在于,NSCopying不仅设计给那些具有可变版本和不可变版本的类来使用,而且还要供其他一些类来使用,而那些类没有“可变”与“不可变”之分,所以说,把拷贝方法叫成immutableCopy不合适。
深拷贝:在拷贝对象自身时,将其底层数据也一并复制过去。
浅拷贝:在拷贝对象自身时,只拷贝容器对象本身,而不复制其中的数据。