performSelector 注意问题及原理

performSelector 注意问题及原理1 首先使用 performSelec 是要特别注意内存泄漏问题 下面代码演示 创建一个控制器 ZWWTestThrea 从上个控制器 push 到该控制器 ZWWLog 的宏定义 ifdefDEBUG defineZWWLog fmt NSLog s Line d fmt PRETTY FUNCTION

ZWWLog的宏定义:

#ifdef DEBUG #define ZWWLog(fmt, ...) NSLog((@"%s [Line %d] " fmt), __PRETTY_FUNCTION__, __LINE__, __VA_ARGS__); #else #define ZWWLog(...) #endif

ZWWTestThreadViewController.m输入代码:

- (void)viewDidLoad { [super viewDidLoad]; ZWWLog(@"retainCount=%ld",CFGetRetainCount((__bridge CFTypeRef)self)); //performSelector调用方法 [self performSelector:@selector(testPerformSelectorFunc) withObject:self afterDelay:10.0]; //直接调用方法 // [self testPerformSelectorFunc]; ZWWLog(@"retainCount=%ld",CFGetRetainCount((__bridge CFTypeRef)self)); } - (void)viewDidDisappear:(BOOL)animated{ [super viewDidDisappear:animated]; ZWWLog(); } // - (void)testPerformSelectorFunc{ ZWWLog(); } - (void)dealloc { ZWWLog(@"对象被销毁"); ZWWLog(@"retainCount=%ld",CFGetRetainCount((__bridge CFTypeRef)self)); }

[NSObject cancelPreviousPerformRequestsWithTarget:self]

当然你也可以一个一个得这样用:

[NSObject cancelPreviousPerformRequestsWithTarget:self selector:@selector(method1:) object:nil]

加上了这个以后,dealloc方法就会被调用,问题解决!

viewDidDisappear方法里面添加代码 [NSObject cancelPreviousPerformRequestsWithTarget:self];

- (void)viewDidDisappear:(BOOL)animated{ [super viewDidDisappear:animated]; ZWWLog(); [NSObject cancelPreviousPerformRequestsWithTarget:self]; } 

二:下面我们再说下performSelector原理及用法

在上面viewDidLoad可以看到,我们调用方法(发送消息)时经常是直接调用方法,那和performSelector区别是什么?

- (void)viewDidLoad { [super viewDidLoad]; ZWWLog(@"retainCount=%ld",CFGetRetainCount((__bridge CFTypeRef)self)); //performSelector调用方法 [self performSelector:@selector(testPerformSelectorFunc) withObject:self afterDelay:10.0]; //直接调用方法 // [self testPerformSelectorFunc]; ZWWLog(@"retainCount=%ld",CFGetRetainCount((__bridge CFTypeRef)self)); }

1、performSelector是运行时系统负责去找方法的,在编译时候不做任何校验;如果直接调用编译时会自动校验。如果testPerformSelectorFunc方法不存在,那么直接调用 在编译时候就能够发现(借助Xcode提示方法全名就发现),但是使用performSelector的话一定是在运行时候才能发现(此时程序崩溃);Cocoa支持在运行时向某个类添加方法,即方法编译时不存在,但是运行时候存在,这时候必然需要使用performSelector去调用。所以有时候如果使用了performSelector,为了程序的健壮性,会使用检查方法- (BOOL)respondsToSelector:(SEL)aSelector;

2、直接调用方法时候,一定要在头文件中声明该方法的使用,也要将头文件import进来。而使用performSelector时候,可以不用import头文件包含方法的对象,直接用performSelector调用即可。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/233769.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • C++字符串流stringstream与string知识介绍与用法小结

    C++字符串流stringstream与string知识介绍与用法小结之前总结了C++的文件输出输入流的相关知识,通过介绍底层的streambuf缓冲区,从而与stringstream流(字符串流)联系了起来,本文就对此进行简单的介绍。首先介绍string。string是C++提供的字符串类,和C类型的字符串相比,除了有不限长度的优点外,还有其他许多方便的功能,其可以看成类似STL里vector数组的一种容器,可以方便的进行数据的增删改查,并可以进行…

    2022年6月10日
    34
  • 百度指数可以下载吗_百度指数能查一年的数据吗

    百度指数可以下载吗_百度指数能查一年的数据吗大家好我是小小明,今天给大家演示如何使用python直接采集百度指数的数据。百度指数(BaiduIndex)是以百度海量网民行为数据为基础的数据分析平台,它能够能够告诉用户:某个关键词在百度的搜索规模有多大,一段时间内的涨跌态势以及相关的新闻舆论变化,关注这些词的网民是什么样的,分布在哪里,同时还搜了哪些相关的词。百分十先生分享过如何使用uiautomation采集百度指数:百度指数如何批量获取?不过个人感觉这方法好像有点杀鸡用牛刀,对于网页使用selenium完全足以,当然对于专门针对sele

    2022年10月8日
    2
  • 周鸿祎经典语录

    周鸿祎经典语录 ·如果是你想干的事情,在别人看起来可能是很难的一件事,不过你自己很喜欢,你不会觉得很苦。我开始创业那会是28岁。对我来讲,我创业的目的不是为了自己当老板,我希望有一个平台有一个环境,我可以控制一些资源,让我去创造一个新的产品和服务;  ·我不会顾忌别人怎么看,或者顾忌到放弃什么东西。我喜欢两句诗“天生我才必有用,千金散尽还复来”。当年离开方正,也是这样仰天大笑出门去……  ·如果说…

    2022年7月26日
    9
  • android的四大组件_android sdk是什么

    android的四大组件_android sdk是什么android四大组件分别为activity、service、contentprovider、broadcastreceiver。一、android四大组件详解1、activity(1)一个Activity通常就是一个单独的屏幕(窗口)。(2)Activity之间通过Intent进行通信。(3)android应用中每一个Activity都必须要在AndroidManif

    2025年8月20日
    4
  • 网站加载 Waiting (TTFB) 时间过长的原因和解决办法

    网站加载 Waiting (TTFB) 时间过长的原因和解决办法

    2022年2月14日
    42
  • 集合类型python_python编程例子

    集合类型python_python编程例子集合集合的特点:是一种可迭代的、无序的、不能包含重复元素的数据结构去重b=[10,5,6,1,9,1]c=set(b)print(c)>>>{1,5

    2022年7月28日
    8

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号