两字母前缀9159.com,少用与之等价的方法

作者: 编程  发布:2019-09-11
文章共分为三篇:

第一篇:iOS 开发 -《Effective Objective-C 2.0:编写高质量 iOS 与 OS X 代码的 52 个有效方法》读书笔记第二篇:iOS 开发 -《Effective Objective-C 2.0:编写高质量 iOS 与 OS X 代码的 52 个有效方法》读书笔记第三篇:iOS 开发 -《Effective Objective-C 2.0:编写高质量 iOS 与 OS X 代码的 52 个有效方法》读书笔记

接上篇:iOS 开发 -《Effective Objective-C 2.0:编写高质量 iOS 与 OS X 代码的 52 个有效方法》读书笔记

这些建议出自《Effective Objective-C 2.0:编写高质量iOS与OS X代码的52个有效方法 [Effective Objective-C 2.0][英] Matt Galloway 著;爱飞翔 译》,有兴趣的同学可以去看看。

编写高质量的Objective-C代码2.0

本篇博客作为读书笔记,主要记录和整理阅读EOC(《Effective Objective-C 2.0 编写高质量iOS与OS X代码的52个有效方法》)时的收货和感悟

第 13 条:用前缀避免命名空间冲突

OC没有其他语言那种内置的命名空间机制。因此我们起名时要设法避免潜在的命名冲突,否则很容易重名,引发命名冲突(naming clash)。避免此问题的唯一方法就是变相实现命名空间:为所有名称都加上适当前缀。所选前缀可以是与公司、应用程序或二者皆有关联之名。另外,Apple宣称其保留使用所有“两字母前缀”,所以我们一般还是三个字母开头比较好。

熟悉Objective-C

1. 了解 Objective-C 语言的起源;

——Effective Objective-C 2.0


第 14 条:提供“全能初始化方法”

能够为对象提供必要信息以便其完成工作的初始化方法叫做“全能初始化方法”。

如果创建类实例的方式不止一种,那么这个类就会有多个初始化方法。这当然很好,不过仍然要在其中选定一个作为全能初始化方法,令其它初始化方法都来调用它。这样的话,当底层数据存储机制改变时,只需修改此方法的代码就好,无须改动其他初始化方法。

NSDate就是一个例子,其初始化方法如下:

- (instancetype)init NS_DESIGNATED_INITIALIZER;- (instancetype)initWithTimeIntervalSinceReferenceDate:(NSTimeInterval)ti NS_DESIGNATED_INITIALIZER;- (nullable instancetype)initWithCoder:(NSCoder *)aDecoder NS_DESIGNATED_INITIALIZER;- (instancetype)initWithTimeIntervalSinceNow:(NSTimeInterval)secs;- (instancetype)initWithTimeIntervalSince1970:(NSTimeInterval)secs;- (instancetype)initWithTimeInterval:(NSTimeInterval)secsToBeAdded sinceDate:date;

在上面几个初始化方法中,initWithTimeIntervalSinceReferenceDate:是全能初始化方法,也就是说,其余的初始化方法都要调用它。只有在全能初始化方法中,才会存储内部数据。

2. 在类的头文件中尽量少引入其他头文件;

第1章 熟悉Objective-C

1.了解OC语言的起源

了解OC的语言特性(运行时),OC的发展来源(C的超集),语法,内存管理策略等。

第 15 条:实现 description 方法

调试程序时,经常需要打印并查看对象信息。一种办法是编写代码把对象的全部属性都输出到日志中。不过最常用的做法还是像下面这样:

NSLog(@"object = %@", object);

这样直接打印我们的对象它会输出 <Object:0x*****>,这并不是我们想要的,所以当我们重写description的时候才可能满足我们调试的需求。

- (NSString *)description { return [NSString stringWithFormat:@"%@ : %@, %@", [self class], self, @"你需要的属性"];}

若想在调试时打印出更详尽的对象描述信息,则应实现 - (NSString *)debugDescription;方法,再与po命令一起使用配合调试。

3. 多用字面量语法,少用与之等价的方法;

第1条:了解Objective-C语言的起源

2.在类的头文件中尽量少引入其他头文件

在.h中引入其他头文件,会大幅度增加编译所需的时间,也有可能会导致循环引入的问题。应当尽量使用“前向声明”(@class)的方式来声明其他类的存在。 为了避免在.h中引入定义协议的头文件,遵守协议应该写在.m中的类扩展里,而不是写在.h中

第 16 条:尽量使用不可变对象

这条主要讲的是,尽量使用不可变的对象。简单来说,我们设计出来一个类,其实是不希望别人更改其属性的,因此应该尽量把对外公布出来的属性设置为只读,而且只在确有必要时才将属性对外公布。

4. 多用类型常量,少用 #define 预处理指令;

第2条:在类的头文件中尽量少引入其他头文件

3.多用字面量语法,少用与之等价的方法

了解和掌握用于快速创建NSNumber、NSArray、NSDictionary的字面量语法:@num,@[],@{};以及相应的下标运算符。需要了解数组和字典创建时遇到nil值会结束的特性,以及使用字面量语法带来的好处。

第 17 条:使用清晰而协调的命名方式

类、方法及变量的命名是 OC 编程的重要环节。这点就不用多说了,具体可以看下官方的命名规则:Coding Guidelines for Cocoa

5. 用枚举表示状态、选项、状态码;

第3条:多用字面量语法,少用与之等价的方法

4.多用类型常量,少用#define预处理指令

在定义仅类内部使用的常量时,应该尽量使用static const的方式来定义。这种定义的会限制其类型,并且避免其他文件的修改。当定义全局变量时,应使用在类内部定义全局变量,在头文件中使用extern引用全局常量的做法。

第 18 条:为私有方法名加前缀

这样有助于调试,也很容易让我们将公共方法和私有方法区分开,另外便于修改方法名。但是要注意不要但用一个下划线做私有方法的前缀,因为这种做法是预留给苹果公司的。

对象、消息、运行期

6. 理解“属性”这一概念;

第4条:多用类型常量,少用#define预处理指令

5.用枚举表示状态、选项、状态码

了解为什么用枚举更好、怎么使用C 11带来的新枚举用法,以及OC中定义的快速创建枚举宏的用法。了解和掌握NS_ENUM和NS_OPTIONS宏的用法。

第 19 条:理解 Objective-C 错误模型

当前很多种编程语言都有异常处理机制,OC也不例外。在OC中异常只用于处理严重错误(fatal error),出现“不那么严重的错误(nonfatal error)”时,OC语言的处理方式是:令方法返回 nil/0,或者使用NSError,以表明有错误发生。

7. 在对象内部尽量直接访问示例变量;

第5条:用枚举表示状态、选项、状态码

6.理解“属性”这一概念

使用@property语法时,编译器会自动生成getter方法和setter方法以及成员变量的。掌握@property的关键字:四种类型(原子性、内存管理策略、读写性、读写方法重命名),以及分别的使用场景和原理。

第 20 条:理解 NSCopying 协议

OC 中,拷贝对象通过copy方法完成,如果想令自己的类支持拷贝操作,那就要实现NSCopying协议,该协议只有一个方法:

- copyWithZone:zone

当然如果要求返回对象是可变的类型就要用到NSMutableCopying协议,相应方法:

- mutableCopyWithZone:zone
  • 在拷贝对象时,需要注意拷贝执行的是深拷贝还是浅拷贝。

    • 深拷贝的意思就是:在拷贝对象自身时,会将对象的底层数据也进行复制。
    • 浅拷贝是只拷贝容器对象本身,而不拷贝其中数据。Foundation 框架中所有的collection 类在默认情况下都执行浅拷贝。
  • 要点:

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

8. 理解“对象等同性”这一概念;

7.在对象内部尽量直接访问实例变量

了解通过属性访问实例变量会触发什么(调用setter或getter方法,触发KVO)了解使用属性来访问成员变量和直接访问成员变量两者的区别与优劣:直接访问成员变量效率更快。

第 21 条:通过委托与数据源协议进行对象间通信

简单来说,这条讲的是使用delegateprotocal进行数据传递。此模式可将数据与业务逻辑解耦。需要注意的是:修饰delegate的属性一定要定义成weak,而非strong,因为两者之间必须为“非拥有关系”。

9. 以“类族模式”隐藏实现细节;

第2章 对象、消息、运行期

8.理解“对象等同性”这一概念

了解isEqual:这一方法的原理,了解NSString中isEqualToString:这一方法做了什么事情。了解如果需要自定义方法来判断两个对象是否相等应该怎么做。

第 22 条:将类的实现代码分散到便于管理的数个分类之中

这条讲的是使用分类。类中经常容易填满各种方法,而这些方法的代码则全部堆在一个巨大的实现文件里。有时这么做是合理的,因为即便通过重构把这个类打散,效果也不会更好。在此情况下,可以通过OC的“分类”机制,将类代码按逻辑划入几个分区中,这对开发与调试都有好处。

10. 在既有类中使用关联对象存放自定义数据;

第6条:理解"属性"这一概念

9.以“类族模式”隐藏实现细节

了解类族的概念,了解如何通过工厂方法来创建类族子类对象。掌握如何通过工厂模式设计工厂方法来实例化子类对象。

第 23 条:总是为第三方类的分类名称加前缀

这条也很容易理解,就是给分类名加前缀,比如NSString分类,

@interface NSString @end// 加前缀@interface NSString @end

给分类加上前缀,易于区分,并且能避免不必要的错误。

11. 理解 objc_msgSend 的作用;

第7条:在对象内部尽量直接访问实例变量

10.在既有类中使用关联对象存放自定义数据

掌握runtime中的objc_setAssociatedObjectobjc_getAssociatedObject方法的作用和用法。掌握冬天获取和添加成员变量的方式。

第 24 条:勿在分类中声明属性

除了 Class-continuation分类,其他分类无法向类中新增实例变量,这样就无法把实现属性所需要的实例变量合成出来,即无法生成实例变量,如下图:

9159.com 1

12. 理解消息转发机制;

第8条:理解"对象等同性"这一概念

11.理解objc_msgSend的作用

理解和掌握OC中的消息机制,理解"selector"、"IMP"的含义。了解objc_msgSend方法的意义

第 25 条:使用 “Class-continuation分类” 隐藏实现细节

Class-continuation分类和普通的分类不同,它必须定义在其所接续的那个类的实现文件里。

#import "NNTestClass.h"@interface NNTestClass ()// 写你所需要的私有变量或方法@end@implementation NNTestClass// 实现@end

这条和之前的描述也有点类似,总之就是在说尽量不要在公共接口中暴露太多内容,隐藏其实现细节。

13. 用“方法调配技术”调试“黑盒方法”;

第9条:以"类族模式"隐藏实现细节

12.理解消息转发机制

了解OC运行时机制,了解当消息接收者无法处理消息时,会调用哪些方法。掌握使用resolveInstanceMethod:resolveClassMethod:方法来动态添加方法、使用forwardingTargetForSelector:方法来转发消息、使用forwardInvocation:方法来处理完整的消息转发。

第 26 条:通过协议提供匿名对象

  • 协议可以在某种程度上提供匿名对象,例如id<someProtocal> objectobject对象的类型不限,只要能遵从这个协议即可,在这个协议里面定义了这个对象所应该实现的方法。
  • 使用匿名对象来隐藏类型名称。
  • 如果具体类型不重要,重要的是对象能否处理好一些特定的方法,那么就可以使用这种协议匿名对象来完成。

14. 理解“类对象”的用意;

第10条:在既有类中使用关联对象存放自定义数据

13.用“方法调配技术”调试“黑盒方法”

了解和掌握runtime方法调用流程,了解"method swizzling"的原理和用法,掌握使用class_getInstanceMethodclass_getClassMethod函数来获取方法实现,使用method_exchangeImplementations函数来交换方法实现。同时需要了解在使用"method swizzling"时,自定义的方法中如何规避调用自身的问题。

第 27 条:理解引用计数

OC 使用引用计数器来管理内存,每个对象都有个可以递增或递减的计数器。对象创建好之后,其保留计数至少为1,若保留计数为正,则对象继续存活,当保留计数降为0时,对象被销毁。在对象的生命周期中,其余对象通过引用来保留或释放此对象。保留或释放操作分别会递增或递减保留计数。

注意retain,release,autorelease,这三个方法操作计数器。

  • retain递增保留计数。
  • release递减保留计数。
  • autorelease待稍后清理“自动释放池”时,再递减保留计数。

接口与API设计

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

第11条:理解objc_msgSend的作用

14.理解“类对象”的用意

了解OC对象的实现方式,了解“类对象”,“isa指针”,“元类对象”的概念。掌握isMemberOfClass:方法和isKindOfClass:方法的作用。

第 28 条:以 ARC 简化引用计数

ARC,即自动管理计数器,理解起来很容易。ARC会自动执行retain,release,autorelease等操作,所以直接在ARC中调用这些内存管理方法是非法的。具体来说,ARC不能调用以下方法:

  • retain
  • release
  • autorelease
  • dealloc

ARC中,变量的内存管理语义可以通过修饰符指明,而原来则需手工执行”保留“及释放操作;(__strong,__weak,一个保留值,一个不保留值)。注意的是ARC只负责管理OC对象的内存。注意:CoreFoundation对象不归ARC管理,必须适时调用CFRetain/CFRelease

16. 提供全能初始化方法;

第12条:理解消息转发机制

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

理解编写自己的类时,使用命名前缀。

第 29 条:在 dealloc 方法中只释放引用并解除监听

不要在delloc方法中调用其它方法,尤其是需要异步执行某些任务又要回调的方法,这样是很危险的行为,很可能异步执行完回调的时候该对象已经被销毁了,crash了。

delloc方法里,应该做的事情就是释放指向其他对象的引用,并取消原来订阅的键值观测(KVO)或NSNotificationCenter等通知,不要做其它事情。

- dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self];}

17. 实现 description 方法;

第13条:用"方法调配技术"调试"黑盒方法"

16.提供“全能初始化方法”

理解和掌握在类的初始化方法中提供一个被其他所有初始化方法调用的“全能初始化方法”。其他初始化方法都调用这个方法来创建实例对象,在这个初始化方法中进行对象的具体配置。

第 30 条:编写 “异常安全代码” 时留意内存管理问题

这条也和上面说过的类似,有两点需要注意:

  • 捕获异常时,一定要注意将try块内所创立的对象清理干净。
 @try { // 可能会出现崩溃的代码 } @catch (NSException *exception) { // 捕获到的异常 exception } @finally { // 结果处理,也可以去掉 }
  • 在默认情况下,ARC 不生成安全处理异常所需的清理代码。开启编译器标志后,可生成这种代码,不过会导致应用程序变大,而且会降低运行效率。

18. 尽量使用不可变对象;

第14条:理解"类对象"的用意

17.实现description方法

掌握通过重写自定义类的description方法来实现描述信息的返回。了解使用debugDescription方法在LLDB中进行调试打印。

第 31 条:以弱引用避免保留环

这个也很容易理解,保留环就是我们常说的循环引用。就是有时候我们需要将某些引用设为weak,避免出现“保留环”。

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

18.尽量使用不可变对象

理解定义公开属性时尽量使用不可变版本的原因,了解在类扩展中修改为readwrite以便类内部可以修改。了解对外公开的集合属性的返回方式。

第 32 条:以“自动释放池块”降低内存峰值

合理运用自动释放池,可降低应用程序的内存峰值。

  • 请看下面几行代码:
 NSArray *dataArray = /*****/; NSMutableArray *testArray = [NSMutableArray array]; for(NSDictionary *recordDic in dataArray) { TestPerson *person = [[TestPerson alloc] initWithRecord:recordDic]; [testArray addObject:person]; }

当循环长度无法预估,需要创建很多对象时,上面代码会创造数量无法预估的临时对象,即内存中会出现很多不必要的临时对象,他们本该提早回收的。这时我们可以给这段代码增加一个释放池:

 NSArray *dataArray = /*****/; NSMutableArray *testArray = [NSMutableArray array]; for(NSDictionary *recordDic in dataArray) { @autoreleasepool { TestPerson *person = [[TestPerson alloc] initWithRecord:recordDic]; [testArray addObject:person]; } }

这样临时对象就可以及时回收了,有一点需要注意:不要把for循环放到释放池里面,特别是循环长度特别长的时候。

20. 为私有方法加前缀;

第3章 接口与API设计

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

了解OC中方法名的命名规范,了解驼峰法书写方式,方法名在言简意赅的同时最好能完整叙述方法的功能,并给每个参数都加上相应的提示。 方法名中不要使用类型名的缩写而是使用类型名的全称。类名、协议名要加上对应的前缀。

第 33 条:用“僵尸对象”调试内存管理问题

9159.com 2僵尸对象

如上图,启动这项调试功能之后,运行期系统在回收对象时,会把它的isa指针指向特殊的僵尸类,而不是真正的回收他们。系统会修改对象的isa指针,令其指向特殊的僵尸类,从而使该对象变为僵尸对象。僵尸类能够响应所有的选择子,响应方式为:打印一条包含消息内容以及其接收者的消息,然后终止应用程序。

21. 理解 Objective-C 错误模型;

第15条:用前缀避免命名空间冲突

20.为私有方法名加前缀

为了避免与公有方法混乱,或是无意中覆盖了父类中的共有方法,在书写类的私有方法时应该给方法加上前缀,比如以p_为前缀。不要仅使用一个单下划线_作为私有方法的前缀,避免和系统类的私有方法重合。

第 34 条:不要使用 retainCount

retainCount,对象的保留计数,ARC环境下已经正式废弃,在MRC下还可以正常使用。

下一篇:iOS 开发 -《Effective Objective-C 2.0:编写高质量 iOS 与 OS X 代码的 52 个有效方法》读书笔记

22. 理解 NSCopying 协议;

第16条:提供"全能初始化方法"

21.理解Objective-C错误模型

了解NSException的使用方法和应用场景。了解NSError的使用。

协议与分类

23. 通过委托与数据源协议进行对象间通信;

第17条:实现description方法

22.理解NSCopying协议

在OC中想要拷贝一个对象时,通常使用copy方法。该对象对应的类需要遵循NSCopying协议,并实现协议中的copyWithZone:方法。如果需要拷贝可变的版本,则需要遵守NSMutableCopying协议并实现mutableCopyWithZone:方法。了解深拷贝和浅拷贝的区别以及实现方式。

24. 将类的实现代码分散到便于管理的数个分类之中;

第18条:尽量使用不可变对象

23.通过委托与数据源协议进行对象间通信

理解OC中代理设计模式的实现思路,掌握delegate和dataSource形式的协议设计。性能优化方面,可以将代理是否实现了代理方法在赋值时进行缓存,可以大大优化频繁调用代理方法时的效率。

25. 总是为第三方类的分类名称加前缀

第19条:使用清晰而协调的命名方式

24.将类的实现代码分散到便于管理的数个分类中

可以将不同模块的代码分散到类的分类中,仅把主要的核心代码保存在主文件中。分类既可以存放在主文件的中,划分不同模块保存,也可以创建不同的分类文件进行保存。

26. 勿在分类中声明属性;

第20条:为私有方法名加前缀

25.总是为第三方类的分类名称加前缀

9159.com ,为了避免重名的情况,分类文件名都应该尽量加上前缀。为了避免分类中的方法实现覆盖了其他分类中的实现或原实现,应该给方法名也加上相应的前缀。

27. 使用 “class-continuation 分类” 隐藏实现细节;

第21条:理解Objective-C错误模型

26.勿在分类中声明属性

由于分类中不会合成属性对应的成员变量,因此不应该在分类中声明属性。虽然可以使用runtime动态添加的方式绑定,但这一并不好,不应该在非必须的时候这样做。分类中应该尽量只用来扩充方法。

28. 通过协议提供匿名对象;

第22条:理解NSCopying协议

27.使用“class-continuation分类”隐藏实现细节

掌握使用类扩展来给类扩充私有实例变量。如果想要使主接口中声明为“只读”的属性能够在内部修改,应该在类扩展中将其改写为“可读写”

内存管理

29. 理解引用计数;

28.通过协议提供匿名对象

了解通过协议来隐藏对象类型细节。如果具体类型不重要,重要的是对象能响应的方法,可以使用匿名对象的方式实现。

30. 以 ARC 简化引用计数;

第4章 协议与分类

29.理解引用计数

了解和掌握OC中进行内存管理的机制,了解引用计数的概念,以及在MRC环境下进行对象内存管理所需使用到的常用方法(retain,release,autorelease,delloc)。

31. 在 dealloc 方法中只释放引用并解除监听;

第23条:通过委托与数据源协议进行对象间通信

30.以ARC简化引用计数

了解ARC的概念,明白编译器在ARC环境下做了哪些事情。并且理解循环引用的概念,了解怎么在ARC模式下怎么避免内存泄漏。

32. 编写“异常安全代码”时留意内存管理问题;

第24条:将类的实现代码分散到便于管理的数个分类之中

31.在delloc方法中只释放引用并解除监听

在delloc方法中只应该进行释放对象引用(尤其是CF中的对象),以及移除观察者、通知监听的操作。如果有大量占用内存的对象需要提前释放,应该在自定义的方法中释放。

33. 以弱引用避免保留环;

第25条:总是为#### 第三方类的分类名称加前缀

32.编写“异常安全代码”时留意内存管理问题

由于在ARC环境下,捕获异常时没办法释放对象引用,所以需要开启编译器的-fobjc-arc-exceptions标志来避免内存泄露。不过在非必要的时候不要开启,避免对性能的影响。

34. 以“自动释放池块”降低内存峰值;

第26条:勿在分类中声明属性

33.以弱引用避免保留环

当有循环引用时,使用weak指针(__weak修饰符)来修饰对象,避免循环引用导致的内存泄漏。

35. 用“僵尸对象”调试内存管理问题;

第27条:使用"class-continuation分类"隐藏实现细节

34.以“自动释放池块”降低内存峰值

在MRC环境下,可以通过手动创建自动释放池的方式来提前释放内存。

36. 不要使用 retainCount ;

第28条:通过协议提供匿名对象

35.用“僵尸对象”调试内存管理问题

通过在编译器scheme中编辑中打开僵尸对象的监测来解决悬垂指针的问题。了解僵尸对象的概念和行成过程。

块与大中枢派发

37. 理解“块”这一概念;

36.不要使用retainCount

即使在MRC模式下,retainCount方法返回的引用计数也并不可靠,不要使用该方法进行对象内存管理的判断。

38. 为常用的块类型创建 typedef ;

第5章 内存管理

37.理解“块”这一概念

了解block的基本概念和使用场景,了解自定义block类型的方式。了解block对象的内存管理情形。

39. 用handler块降低代码分散程度;

第29条:理解引用计数

38.为常用的块类型创建typedef

掌握使用typedef给block起别名,把类中常用的block类型定义为自定义的数据类型。

40. 用块引用其所属对象时不要出现保留环;

第30条:以ARC简化引用计数

39.用handler块降低代码分散程度

掌握使用block回调的方式进行传值,使用completionHandler来处理完成回调,或者以两个block参数分别作为成功和失败的回调。这样做比使用delegate的方式更加便捷,并且具有可读性。

41. 多用派发队列,少用同步锁;

第31条:在dealloc方法中只释放引用并解除监听

40.用块引用其所属对象时不要出现保留环

由于block会自动捕获其中使用到的对象,对其进行一次引用,所以在使用block时需要注意循环引用的情况。可以通过手动解除引用的方式解决,也可以通过将被捕获的对象用__weak修饰符修饰的方式解决。

42. 多用 GCD ,少用 preformSelector 系列方法;

第32条:编写"异常安全代码"时留意内存管理问题

41.多用派发队列,少用同步锁

当需要自己编写带有线程安全机制的代码时,可以考虑使用GCD的同步异步函数方式来实现。

43. 掌握 GCD 及操作队列的使用时机;

第33条:以弱引用避免保留环

42.多用GCD,少用performSelector系列方法

performSelector方法由于存在内存管理的缺陷,以及参数和返回值类型限制等问题,不建议使用。最好使用GCD的方法来实现方法调用和线程通信。

44. 通过 Dispatch Group 机制,根据系统资源状况来执行任务;

第34条:以"自动释放池块"降低内存峰值

43.掌握GCD及操作队列的使用时机

了解和掌握NSOperation的使用,在实现多线程时也可以考虑使用。当需要处理任务取消、添加依赖、键值观察、指定任务优先级这些gcd无法实现的功能时应该用NSOperation来解决。

45. 使用 dispatch_once 来执行只需运行一次的线程安全代码;

第35条:用"僵尸对象"调试内存管理问题

44.通过Dispatch Group机制,根据系统资源状况来执行任务

当需要等待某个或某些任务执行完毕时,可以通过将任务添加到一个队列组的方式实现。使用dispatch_group_notify方法来实现当队列中任务全部完成时执行某一代码块。

46. 不要使用 dispatch_get_current_queue ;

第36条:不要使用retainCount

45.使用dispatch_once来执行只需运行一次的线程安全代码

当需要编写在整个程序运行的生命周期中只会运行一次的代码,可以使用gcd的dispatch_once函数来实现。单例设计模式中推荐使用这种方式而不是线程锁

系统框架

47. 熟悉系统框架;

46.不要使用dispatch_get_current_queue

dispatch_get_current_queue函数已经废弃,而且该函数返回的队列很可能与开发者预期的不同,因此使用的时候容易出现问题。应使用队列特定数据的方式来解决。

48. 多用块枚举,少用 for 循环;

第6章 块与大中枢派发

47.熟悉系统框架

熟练掌握Foundation框架和CoreFoundation框架的主要功能,熟悉常用的音频视频处理、网络通信、数据管理等系统框架,避免在开发中自己去实现一些系统已经实现好了的功能。

49. 对自定义其内存管理语义的 collection 使用无缝桥接;

第37条:理解"块"这一概念

48.多用块枚举,少用for循环

掌握几种遍历集合的方式,掌握使用块循环enumerateObjectsUsingBlock:方法来实现遍历。

50. 构建缓存时选用 NSCache 而非 NSDictionary ;

第38条:为常用的块类型创建typedef

49.对自定义其内存管理语义的collection使用无缝桥接

了解和掌握Foundation对象和CoreFoundation数据结构之间转换的方式。

51. 精简 initialize 与 load 的实现代码;

第39条:用handler块降低代码分散程度

50.构建缓存时选用NSCache而非NSDictionary

在进行数据持久化缓存时,应该优先使用NSCache类来实现。NSCache相比NSDictionary具有自动删减、线程安全、不拷贝键的优势。

52. 别忘了 NSTimer 会保留其目标对象。

最后给一下此书电子版下载地址,请支持正版图书!

第40条:用块引用其所属对象时不要出现保留环

51.精简initialize与load的实现代码

load方法在代码被加载到代码区的时候调用,尽量不要在load方法中做复杂的工作,避免影响应用程序的启动速度。load方法和initialize方法中都应该避免对其他类的调用,避免加载或初始化时机差异导致的问题。未实现load方法的子类,即使父类实现了,也不会调用;未实现initialize方法的子类,会调用其父类的方法。

第41条:多用派发队列,少用同步锁

52.别忘了NSTimer会保留其目标对象

当创建一个Timer对象时,timer会保留其引用到的target对象,如果timer的模式是重复执行的,那么会有很大的可能产生循环引用。应该使用block的方式创建,或手动invalidate timer来避免内存泄露的问题.


第42条:多用GCD,少用performSelector系列方法

《Effective Objective-C 2.0》全书的内容到这里就介绍完了,这本书非常全面的介绍了iOS开发中比较常遇到的问题或者需要规避的坑,还是非常有帮助的,有条件的读者建议自己买一本或借一本读一下,肯定会有不少收获!

第43条:掌握GCD及操作队列的使用时机

之后会给大家带来一篇由iOS开发大牛唐巧撰写的《iOS开发进阶》的读书笔记,希望能给大家带来一些收获!敬请期待!

第44条:通过Dispatch Group机制,根据系统资源状况来执行任务

第45条:使用dispatch_once来执行只需运行一次的线程安全代码

第46条:不要使用dispatch_get_current_queue

第7章 系统框架

第47条:熟悉系统框架

第48条:多用块枚举,少用for循环

第49条:对自定义其内存管理语义的collection使用无缝桥接

第50条:构建缓存时选用NSCache而非NSDictionary

第51条:精简initialize与load的实现代码

第52条:别忘了NSTimer会保留其目标对象

本文由9159.com发布于编程,转载请注明出处:两字母前缀9159.com,少用与之等价的方法

关键词: 9159.com

上一篇:你的博客,网站流量越大
下一篇:没有了