OC语言收获

本文介绍了Objective-C中的多种编程技巧,包括属性类型、弱引用、内存管理、KVC和KVO的使用方法,以及如何处理相互引用等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1.copy类型的属性
@property ( nonatomic , copy ) NSString *text;
  _text = [text copy ]; //生成的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.浅复制与深复制之间的区别 这篇博客有深入分析
      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.数组系统排序底层实现:冒泡排序
[ _fontNames sortedArrayUsingComparator :^ NSComparisonResult (
 id_Nonnullobj1,id _Nonnull obj2) {
return [( NSString *)obj1 compare :( NSString *)obj2];
}];

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

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

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












评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值