本文介绍: 继续学习Effective_Objective-C。这一章的简介就是在于让开发者熟练的掌握OC语言编程规范选择与你的公司应用程序或者二者皆有关联名称作为类名的前缀,并在所有代码中均使用这一前缀。若是自己所开发程序库中用到第三方库,则应为其中的名称加上前缀。这一章学的大部分之前都了解过或者使用过但不知道原理,还是要加深印象。

前言

15.用前缀避免命名空间冲突

要点总结

16.提供全能初始化方法

全能初始化
要点
  • 类中提供一个全能初始化方法,并与文档里指明。其他初始化方法均应调用此方法。
  • 若全能初始化方法与超类不同,则需覆写超类中对应方法。
  • 如果超类的初始化方法不适用于子类,那么应该覆写这个超类方法,并在其中抛出异常
  • 一个类有多个全能初始化方法要注意,我们就是要维持原来类的调用链,每个子类的全能初始化方法都应该调用其超类的对应方法,并逐层向上。因为其父类两个全能初始化方法,这两种初始化方法定义出来的数据可能是不同的,若是你在子类中调用了错误父类初始化方法,它就会可能因为数据类型问题使程序发生错误
  • 重写初始化方法也要注意如果子类的全能初始化方法与超类方法的名称不同,我们总应覆写超类的全能初始化方法,避免子类调用父类的全能初始化方法

17.实现description方法

description

#import "EOCPerson.h"
@interface EOCPerson : NSObject
@property (nonatomic, strong)NSString *firstName;
@end

@implementation EOCPerson
- (NSString *)description {
    return [NSString stringWithFormat:@"< %p, "%@&gt;",self, self.firstName];
}
@end

请添加图片描述

字典形式输出description
debugDescription

要点

18.尽量使用不可变对象

要点

19.使用清晰协调的命名方式

  • 清晰的命名读起来是很方便的,这个习惯需要及时的纠正,不仅自己可以读懂,其他人也可以读懂,在合作的时候显得颇为重要
方法命名
  • 如果方法的返口值是新创建的,那么方法名的首个词应是返回值的类型,除非前面还有修饰语,例如localizedString。属性的存取方法不遵循这种命名方式,因为一般认为这些方法不会创建新对象,即便有时返口内部对象的一份拷贝,我们也认为那相当手原有的对象。这些存取方法应该按照其所对应的属性来命名。
  • 应该把表示参数类型的名词放在参数前面。
  • 如果方法要在当前对象上执行操作,那么就应该包含动词;若执行操作时还需数,
    则应该在动词后面加上一个或者多名词
  • 不要使str这种简称,应该用 string 这样的全称。(经典)
  • Boolean 属性应加is前级。如果某方法返口非属性的 Boolean 值,那么应该根据其功
    能,选用has 或is前缀
  • get这个前缀留给那些借由“输出” 参数,来保布返口值的方法,比如说,把返回值填充到“C语言数组”(C-style array)里的那种方法就可以使用这个词做前缀。
类与协议命名
  • 应该为类与协议的名称加上前缀,以避免命名空间冲突,而且应该像给方法起名时那样把词句组织好,使其从左至右读起来较为通顺。基本命名规则就是:命名方式应该一致,如果要从其他的类中继承子类,那么就要遵守其原本的命名惯例。 例如:UIView它的子类就应该是***View,表明其来历。
  • 在写自己项目的时候就出现了这个问题,我把view放在前面了导致看的时候比较混乱,一大段的view 不知道哪个是哪个

要点

  • 起名时应遵从标准的OC命名规范,这样创建出来的接口更容易为开发者理解
  • 方法名要言简意赅,从左至右读起来要像个日常用语中的句子才好。
  • 方法名里不要使用缩略后的类型名称。
  • 方法名起名时的第一要务就是确保其风格与你自己的代码或所要集成框架相符。

20.为私有方法名加前缀

  • 通常我们在写方法时,并没有对其进行私有共有分类,导致调试时可能很麻烦,现在为私有方法加上前缀,这样便于修改方法或方法签名。具体加什么来代表私有方法因人而异,自己怎么舒服怎么来,唯一注意的是:一定不要只使用_作为前缀,用p_都比那个好,因为苹果公司使用的就是_作为私有方法的前缀的,你自己定义私有方法名有可能就会和人家自带的冲突。
  • 私有方法的名称加上前缀,这样可以很容易地将其同公共方法区分开。
  • 不要单用一个下划线私有方法的前缀,因为这种做法是预留给苹果公司用的。

21.理解Objective-C的错误类型

ARC的异常安全
NSError
  • 现在OC不会轻易的抛出异常,当然错误是随时都可能发生的,所以对于没有达到严重错误级别的错误,OC语言会返回nil 或者 0,还有就是使用NSError.以表明其中有错误发生.
  • 这个是返回nil的例
    请添加图片描述
    • 在这周情况下,如果发现无法创建self,则self置nil,我们创建的时候发现创建不出来对象就会知道出错了
  • NSError相比之下更加的灵活,它可以把错误的原因回报给调用者封装如下
    请添加图片描述
NSError用法

要点

22.理解NSCopying协议

NSCopying
  • NSCopying是NSObject的协议之一,它用于实现自定义类的copy。
  • 该协议只有一个方法请添加图片描述
    • NSZone: 在之前开发程序的时候会吧内存分成不同的区,对象则会被创建在某个区里面,现在所有的程序只有一个“默认区”,所以无需紧要这个区
  • 若想某个类实现copy功能,则需要声明NSCopying协议然后实现对应的方法。
  • 需要注意如果你的类分为可变版本和不可变版本那么还需要实现NSMutableCopying协议和对应的方法
@protocol NSCopying

- (id)copyWithZone:(nullable NSZone *)zone;

@end

@protocol NSMutableCopying

- (id)mutableCopyWithZone:(nullable NSZone *)zone;

@end

请添加图片描述

  • 对于不可变的NSArray与可变的NSMutableArray来说,存在如下关系
[NSMutableArray copy] => NSArray
[NSArray mutableCopy] => NSMutableArray

    • 在可变的对象实现不可变copy返回的是另外一个不可变实例,如此做是为了能在可变版本和不可变版本实现自由切换
深浅拷贝的使用时机
  • 要执行“深拷贝”还是“浅拷贝”?
    • 浅拷贝:在拷贝对象自身时,只拷贝容器对象本身,而不复制其中的数据。
      请添加图片描述
  • 如果有需要,我们可以自行添加一个深拷贝方法。请添加图片描述
  • 这个自行实现的深拷贝也可以看出来深浅拷贝的区别深拷贝是在堆里新开辟一块内存存放底层数据。
  • 浅拷贝是只拷贝存放在栈上指向堆内存的指针
	NSArray *array = @[@"immutableCopy", @"mutableCopy"];
    NSArray *immurtableArray = [array copy];
    NSArray *mutableArray = [array mutableCopy];

请添加图片描述
请添加图片描述
请添加图片描述

    • 可以看出copy出的immuatleArray和原array指向了同一块内存区。而mutalbeArray在堆里新开辟一块内存存

要点

  • 若想令自己所写的对象具有拷贝功能,则需实现NSCopying协议。
  • 如果自定义的对象分为可变版本和不可变版本,那么就要同时实现NSCopying与NSMutableCopying协议。
  • 复制对象时需决定采用浅拷贝还是深拷贝,一般情况下应该尽量执行浅拷贝。
  • 如果你所写的对象需要深拷贝,那么可考虑新增一个专门执行深拷贝的方法。

总结

  • 这一章学的大部分之前都了解过或者使用过但不知道原理,还是要加深印象。

原文地址:https://blog.csdn.net/weixin_61639290/article/details/128377543

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。

如若转载,请注明出处:http://www.7code.cn/show_11667.html

如若内容造成侵权/违法违规/事实不符,请联系代码007邮箱suwngjj01@126.com进行投诉反馈,一经查实,立即删除

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注