Open jiangleligejiang opened 5 years ago
通常延时任务会采用
dispatch_after
或performSelector:withObject:afterDelay:
,而前者没办法取消延时任务,后者则可以通过cancelPreviousPerformRequestsWithTarget:selector:object:
方法取消。
对于延时任务,一定要考虑清楚遇到一些特殊情况下,是否还要执行,若不需要,则应该取消该任务,避免不必要的错误。
通常在使用performSelector:withObject:afterDelay:
可以先执行cancelPreviousPerformRequestsWithTarget:selector:object:
方法取消掉之前的任务
若在view
或view controller
中使用了performSelector:withObject:afterDelay:
方法,则应该在dealloc
方法中使用cancelPreviousPerformRequestsWithTarget
取消所有的延时任务,避免内存泄漏。
isKindOfClass
和isMemberOfClass
的区别
isKindOfClass
是用来确定一个对象是否是一个类的成员,或者是派生自该类的成员;isMemberOfClass
只能确定一个对象是否是当前类的成员; 简而言之,isMemberOfClass
可以看作是更为严格的isKindOfClass
。
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
Objective-C中对象的拷贝分为深拷贝和浅拷贝。另外还有容器类对象及非容器类对象的差别:
Equality的判定