jiangleligejiang / JNote

记录相关日常笔记
0 stars 0 forks source link

NSObject相关内容 #23

Open jiangleligejiang opened 5 years ago

jiangleligejiang commented 5 years ago

Equality的判定

jiangleligejiang commented 5 years ago

removeObject和removeObjectIdenticalTo的区别

jiangleligejiang commented 5 years ago

延时执行任务和取消延时任务

通常延时任务会采用dispatch_afterperformSelector:withObject:afterDelay:,而前者没办法取消延时任务,后者则可以通过cancelPreviousPerformRequestsWithTarget:selector:object:方法取消。

jiangleligejiang commented 5 years ago

isKindOfClassisMemberOfClass的区别

isKindOfClass是用来确定一个对象是否是一个类的成员,或者是派生自该类的成员; isMemberOfClass只能确定一个对象是否是当前类的成员; 简而言之,isMemberOfClass可以看作是更为严格的isKindOfClass

jiangleligejiang commented 5 years ago

关于performSelector的warning:"performSelector may cause a leak because its selector is unknown".

产生这个警告的主要原因是因为编译器无法检查到是否存在这个selector。为了避免这个warning,可以使用下面的宏来实现。

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"
[transaction.target performSelector:transaction.selector];
#pragma clang diagnostic pop
jiangleligejiang commented 5 years ago

深浅拷贝问题

Objective-C中对象的拷贝分为深拷贝和浅拷贝。另外还有容器类对象及非容器类对象的差别:

  1. 对非容器类对象(如NSString、NSMutableString类对象)使用浅拷贝:拷贝的是对象的地址,没有新的内存被分配,只是原来的那块内容多了一个指针指向。也就是说新对象跟原对象都是指向的同一个内存地址,那么内容当然一样。
  2. 对非容器类对象(如NSData、NSMutableData类对象)使用深拷贝:拷贝的是整个对象内容了,是通过给新对象分配了一块新的内存,然后将原对象对应内存中的内容一模一样在新的内存中写一份。所以内容是一样的,但是此时新对象与原对象的内存地址是不同的。
  3. 对容器类对象(如NSArray、NSMutableArray类对象)使用浅拷贝:新的容器类对象也是指向的新的内存地址,但是容器内保存的对象没有进行拷贝,指向的内存地址还是和原容器对象内保存的对象指向的内存地址是一样的。也就是说你改了其中一个容器对象中的元素对象,那么另一个容器对象中的元素对象也会相应修改(是同一个内存地址嘛)。
  4. 对容器类对象(如NSDictionary、NSMutableDictionary类对象)使用深拷贝:是需要对容器对象中的每一个元素都进行拷贝 ———————————————— 原文链接:https://blog.csdn.net/G_eorge/article/details/78219957