OC语言收获

来源:互联网 发布:淘宝企业店铺直通车 编辑:程序博客网 时间:2024/06/06 04:06
1.copy类型的属性
@property(nonatomic,copy)NSString *text;
 _text= [textcopy];//生成的copy类型的属性这样复写setter方法更严谨

2._weak:声明为weak的指针,指针指向的地址一旦被释放,这些指针都将被赋值为nil。

3.OC中定义的全局变量未初始化时值会默认为0 局部变量随机

4.super是个标识符 从父类的方法列表中开始查找方法 其本质依旧是self

5.NSDictionary字典中key可以是不同类型的对象

6.NSString中 == 比较的是内存地址 ,不可变数组中系统优化内容相同的字符串存到同个字符串常量区

7.协议:协议中不能定义属性 用id<协议名>接收参数

8.对于NSString类型必须使用copy的原因:

对源头是NSMutableString的字符串,retain仅仅是指针引用,增加了引用计数器,这样源头改变的时候,用这种retain方式声明的变量(无论被赋值的变量是可变的还是不可变的),它也会跟着改变;而copy声明的变量,它不会跟着源头改变,它实际上是深拷贝。

对源头是NSString的字符串,无论是retain声明的变量还是copy声明的变量,当第二次源头的字符串重新指向其它的地方的时候,它还是指向原来的最初的那个位置,也就是说其实二者都是指针引用,也就是浅拷贝

9.浅复制与深复制之间的区别 这篇博客有深入分析
        http://www.cnblogs.com/langtianya/p/3722129.html
      retain:始终是浅复制。引用计数每次加一。返回对象是否可变与被复制的对象保持一致。
      copy:对于可变对象为深复制,引用计数不改变 已经生成了一个新的不可变的对象(所以不用retain);对于不可变对象是浅复制,引用计数每次加                        一。始终返回一个不可变对象。
      mutableCopy:始终是深复制,引用计数不改变。始终返回一个可变对象。

10.MRR和ARC相互引用解决办法:
MRR:设置其中一个为assign 另一个retain
ARR:设置其中一个为__weak 另一个为__strong
代理delegate必须设置为__weak
如果代理类里将被代理类作为属性,使用__strong会导致相互引用

11.如果想要将ARC类型的和MRR类型的导入到同一个工程,那么
      非ARC标记-fno-objc-arc
       ARC标记-fobjc-arc

12.setValue:forKey:(KVC)默认的搜索顺序
  1. KVC从receiver([receiver massage])的类中查询访问方法set<Key>
  2. 如果set<Key>未找到,且receiver的类方法accessInstanceVariablesDirectly返回YES,则receiver依次搜索名字为_<key>, _is<Key>, <key>, is<Key>,的实例变量,注意搜索顺序。
  3. 如果找到了访问方法或者实例变量,则利用其设置对应的value。
  4. 如果既没有搜索到访问方法,也没有找到实例变量,则receiver会调用 setValue:forUndefinedKey: 方法
  5. 当KVC取到的key值没有对应的value值可以赋值时 系统会自动调用此方法 通过重写此方法 可以防止程序崩溃
    - (void)setValue:(id)value forUndefinedKey:(NSString*)key
13.KVC可以给属性的属性赋值 或者给私有属性赋值
     
14.KVO注意的点:
       1. KVO 必须要有调用setter方法才会被观察者观察到 否则不会触发
        2.  KVO无法观察系统提供的对象
       3. 观察者KVO自动调用的方法会在子线程调用如果 此方法中需要刷新UI界面时 需要重新回到主线程(多线程下KVO需要注意的点)
- (void)observeValueForKeyPath:(NSString*)keyPath ofObject:(id)object change:(NSDictionary<NSString*,id> *)change context:(void          *)context ;

15.用 for-in 去遍历容器时的底层实现:
NSArray,是按照数组 index 的顺序来遍历。
NSDictionary,是通过遍历字典的 keys 数组,再通过 valueForKey: 来获取 value。
NSSet,是无序的。

16.字典中取值最好使用objectForKey
      一般来说 key 可以是任意字符串组合,如果 key 不是以 @ 符号开头,这时候 valueForKey: 等同于 objectForKey:,如果是以 @ 开头,去掉 key 里的 @ 然后用剩下部分作为 key 执行 [super valueForKey:]

17.数组系统排序底层实现:冒泡排序
[_fontNamessortedArrayUsingComparator:^NSComparisonResult(
 id_Nonnullobj1,id_Nonnull obj2) {
return[(NSString*)obj1compare:(NSString*)obj2];
}];

18.数组一般使用lastObject 取其中随便一个元素 此时如果数组为空 使用lastObject 不会崩溃 因为里面有trycash

19.定时器方法使用:注意:停止后,一定要将timer赋空,否则还是没有释放

20.将整形数据转换成字符串的快速方法
[@(live.onlineUsers)stringValue]












0 0