OC编程笔记

  1. 如果要给一个属性不一样的访问方法,需要在property里进行指定,如下: @property(getter = isFinished) BOOL finished;
  2. 可以自定义变量名字,需要定义跳转的值,如下: @implementation class @sythesize propertyName = instanceVarivalbeName …. @end
  3. 一定要保证weak属性在被调用之前不为nil,比如: if(self.weakProperty) {….}
  4. Unsafe Unretained: 有些不支持weak的属性,比如NSTextView,NSFont和NSColorSpace等,使用方法如下: @property (unsafe_unretained) NSObject *unsafeProperty; NSObject *__unsafe_unretained unsafeReference; unsafe 引用 和weak引用类似,但是他在目标对象为nil时不会被置为nil。所以有可能存在野指针的情况。
  5. 处理两个对象时,==操作符表示测试两个不同指针是否指向同一个对象; 如果要测试两个对象是否含有同样的值,应当使用 isEqual方法。
  6. 在运行时,通过category添加的方法和通过原始class添加的方法没有区别。
  7. 除了可以给现有class添加方法,category也可以用来分割复杂class的各种实现。
  8. 如果一个在category里定义的方法名和原始class或者另一个category中定义的方法名一样,那么运行时执行哪一个方法名的方法就不一定了。
  9. 为了防止未定义的行为,最佳实践是给方法名添加前缀。
  10. extension和category功能类似,但是extension只可以给已知源码的class添加方法。
  11. class extension经常用来给public class添加private方法或者属性。 例如,定义一个属性为readonly在外部,但是内部定义该属性为readwrite,为了内部能直接改变属性值。
  12. 和class extension不同,associated reference 不影响原始class的定义和实现,所以说即便没有对原始数据的访问权限,也可以使用。 objc_setAssociatedObject
  13. NSArray和NSDictionary只可以用来收集OC对象,其它对象必须封装在OC对象之内才可以init到上述类型之中。
  14. NSNumber是一个类簇。意思是当你在运行时创建一个实例时,你会得到一个具体的子类来存储提供的值,就当那个对象是NSNumber的子类就好。
  15. 在sort的时候: a) NSArray类型由于是不可变,所以调用sort方法会返回一个新的array对象。 b) Mutable的Array可以直接sort,不需要返回新array
  16. 如果在collection中想表达”no object”,可以使用NSNull类
  17. 很多collection类实现了NSFastEnumeration协议,包括NSArray,NSSet和NSDictionary。
  18. 在快速遍历collection时是不可以修改值的,即便是mutable的变量。如果你打算add或者remove一个对象,会导致一个运行时异常。
  19. 通过反复调用nextObject也可以遍历所有内容,比如: while((eachObject = [enumerator nextObject])){……}
  20. 如果真的想在条件处赋值,则需要将赋值语句加括号,比如: if((someVar = YES))
  21. 用快速遍历比手工用遍历对象要快。
  22. 如果在block之后修改了block内部读取的值,因为该值被capture了,所以在block生效时不会收影响。比如: int value = 42; void (^testBlock)(void) = ^{ NSLog(“%d”,value);}//print 42 while ext value = 84; testBlock();
  23. 如果想改变block中的引用值,需要用__block标志。这时候该值的生命周期在block内外都是有效的。 __block int value = 42; void (^testBlock)(void) = ^{ NSLog(“%d”,value);}//print 84 while ext value = 84; testBlock();
  24. block类型应当设置其类型为copy,因为block需要copy以保证保持原始调用域的环境。不过在ARC下不需要考虑这个问题,因为block自动会以copy形式定义。
  25. 下述方法遍历每一个键值对更加方便: NSDictionary *dict = … [dictionary enumerateKeysAndObjectsUsingBlock:^(id key, id obj,BOOL *stop) { NSLog(“key:%@,value:%@”,key,object); }
  26. 创建NSError时,需要定义自己的errorDomain,应该形式如下: com.companyName.appOrFrameworkName.ErrorDomain 创建完整的Error如下: NSString *domain = @”com.MyCompany.MyApplication.ErrorDomain”; NSString *desc = NSLocalizedString(@”Unable to…”,@””); NSDictionary *userInfo = @{NSLocalizedDescriptionKey:desc}; NSError *error = [NSError errorWithDomain:domain code:-101 userInfo:userInfo];
  27. 自定义类应当使用三个字母的前缀。命名最好用名词,以表示所指,例如:NSWindow, CAAnimation等
  28. 如果method需要一个或多个参数,方法名需要暗示出每一个参数,比如: subStringFromIndex: writeToUrl:
  29. 方法名的第一部分应当暗示方法的主要意图或者方法的返回值。如果返回值很重要,可以用复合词,比如mutableCopy. 如果一个方法返回一个action,第一个单词应当暗示那个action,例如write…或者enumerate…
  30. 如果一个方法需要传入error参数,此参数应该排在最后;如果一个方法含有block,block应当排在最后,为了使得方法名在调用时尽量处于统一行,方便可读。因此尽量在方法中少包含block变量。
  31. 少写缩写。
  32. 工厂类方法在创建时应当以类名字作为开头(无前缀),除非类的子类存在相同的工厂方法了。例如 [NSMutableArray array];
  33. 只要见到mutable就是深拷贝。 列表:

[immutableObject copy]//浅copy [immutableObject mutableCopy]//单层深copy

[mutableObject copy]//单层深copy [mutableObject mutableCopy]//单层深copy

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏天天

Airbnb JavaScript Style Guide

const foo = 1; let bar = foo; bar = 9; console.log(foo, bar); // => 1, 9

20320
来自专栏技术总结

《Objective-C高级编程》温故知新之"自动引用计数"

1、使用alloc、new、copy、mutableCopy的意味着自己生成的对象只有自己持有

13950
来自专栏代码散人

ios开发 Runtime 详解part2(动态方法解析)

在 ios开发 Runtime 详解part1中我已经解释了Introspection,接下来介绍Runtime的其它特性。

11010
来自专栏技术总结

iOS 复制知识点总结

227110
来自专栏Objective-C

Swift 基本语法05-"String"

29490
来自专栏学海无涯

24. Swift学习之where关键字

在Swift中很多地方都是用到了一个关键字where,这个关键字的含义和数据库中的where差不多,用于条件筛选(条件过滤),那么在Swift中哪些地方用到了这...

13920
来自专栏xx_Cc的学习总结专栏

iOS-RunTime,不再只是听说

31570
来自专栏程序员Gank

《Objective-C-高级编程》干货三部曲(一):引用计数篇

总结了Effective Objective-C之后,还想读一本进阶的iOS书,毫不犹豫选中了《Objective-C 高级编程》:

21240
来自专栏iOS 开发杂谈

iOS RunTime之二:数据结构

由上面一章中,我们了解了什么是RunTime,RunTime用来做什么,下面了解一下Runtime数据结构。

18920
来自专栏xx_Cc的学习总结专栏

iOS底层原理总结 - 探寻Runtime本质(四)

首先来看一道面试题。 下列代码中Person继承自NSObject,Student继承自Person,写出下列代码输出内容。

25040

扫码关注云+社区

领取腾讯云代金券