zoukankan      html  css  js  c++  java
  • Effective ObjectiveC 2.0 Note

    Effective ObjectiveC 2.0 Note

    1、The memory for objects is always allocated in heap space and never on the stack。

    2、对于[NSArray arrayWithObjects:obj1,obj2,obj3,nil]。当使用方法时,如果obj2为空,则只有obj1被插入。录使用Literals时,@[objc3,obj2,obj3],如果objc2为空,会抛出异常。dictionary同理。

    3、Literals语法创建的容器均为不可变类型,如果要创建可变类型,需要加mutableCopy。如:

      [@[@1,@1] mutableCopy]

    4、Objc has no namespace。

    5、使用有类型的const Type定义来替换define宏。

    6、使用NS_ENUM、NS_OPTIONS来定义枚举变量:

     7、在类内部,使用accessor还是直接访问属性。若读则直接访问,若写则使用accessor。直接访问的好处是速度快;直接访问的问题是会让property的copy、atomic语意失效,以及让KVO失效。另外,使用property有助于调试,你可以在accessor中添加断点来查看谁修改了变量。

    8、在方法:init/dealloc 中,赋值的时候直接访问variable,因为如果子类实现了同样的property,则会调用子类的方法,而改变父类的初始语义。

    9、==比较的是指针本身的值,想要比较两个对象的内容是否相待,需要实现isEqual方法。isEqual默认比较两个指针是否一致。isEqual相等的两个对象,其中hash返回值必相等;但hash值相等的对象,其isEqual未必相等。hash返回值被用于容器索引。
     
    10、因为NSArray是一个Class Cluster,所以以下代码是错误的:
      
      正确的方法应该像如下这样:
      
    11、指定的构造函数(designated initializer)可以有多个,指定的构造函数必须调用父类的指定构造函数。非指定构造函数最终会调用到指定构造函数。有一种建议是子类必须覆盖继承链上所有的指定构造函数,但个人认为此法可取也不可取。
    12、用NSLog输出时,description提供文本。在debugger中用po输出时,debugDescription提供文本。
    13、对于readonly属性,如果希望对外只读,对内可读写,则在extention中设置为readwrite,而在.h中设置为readonly。
    14、苹果框架的前缀均以2个大写英文字母打头,所以自定义类的前缀最好是3个大写字母,为了与苹果框架前缀以区分开,避免冲突。
       苹果框架的私有方法以一个下划线打头,所以自定义类的私有方法最好避免以一个下划线打头,避免冲突。
    15、异常最好只用抛弃fetal-error。对于其它普通错误,可以通过返回BOOL值,以及NSError来反馈错误。
    16、 NSCopying协议用于普通的copy,NSMutableCopying用于变化的copy。
    17、view只负责如何显式,不负责获取哪些数据显式,获取数据应该由controller来做。
    18、delegate有2种作用,一种是delegate提供数据,一种是为delegate提供通知。
    19、如果一个protocol只在类内部使用,则应声明在extension里。
    20、破解retain cycle的方法有2种,一是使用weak引用,另一个是强制破解其中一条引用从而使环被破除。
    21、不同的方法名,ARC对返回值的处理不同:
        
      对于newPerson,ARC直接返回;对于somePerson,ARC返回[person autorelease]。
    22、不要使用retainCount:
      1)考虑到autorelease,retainCount可能非常大,以及不好预测。
      2)retainCount最小值是1,永远不会为0。
      3)taggedPtr的retainCount无意义。
    23、@synchrosized()的坏处是所有类的访问共用一把锁。有时使用NSLock能提供更好的锁访问控制功能。
    24、performSelector系列函数在ARC下不安全,ARC无法判定此函数的返回值对象该如何处理,从而有可能导致leaks。使用block来代替。
    25、GCD有一些没有的功能,需要由其它框架来提供:
      1)GCD没有提供取消任务的功能。但NSOperationQueue提供了取消任务的功能。
      2)GCD没有提供任务依赖功能,barrier提供了一种较弱的可行的方法。但NSOperation提供了设置依赖的渠道。
    26、遍历有4种:
      1)for (int i =0; i < array.count; i++)
      2) for (Item* item in array)
      3) NSEnumerator
      4) [array enumerateWithBlock]
    27、NSCache用于存储key-value,但其提供当内存不足的时候(收到内存警告)自动释放掉一些元素。
    28、在Load方法中使用其它类不安全,因为此时其它类对象可能还没被加载进内存。
    29、在initialize方法中可以安全地使用其它类的方法。
    30、NSTimer会retain对象,易引用双向引用而导致的Leak。
  • 相关阅读:
    Java核心(七):this和super的区别
    Java核心(六):==和equals()的区别;重写equals()方法
    java核心(五):堆内存、栈内存;String赋值时,内存变化
    Java核心(四):Java中的装箱和拆箱
    Java核心(三):代码块的作用
    从数据库中导出.csv文件
    mongodb中数据类型的坑
    return 和 echo 的小坑
    对数据库中初始的数据在后台进行翻译
    SQL语句执行效率及分析
  • 原文地址:https://www.cnblogs.com/tekkaman/p/3751518.html
Copyright © 2011-2022 走看看