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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 实现一维卷积神经网络的方法_卷积神经网络处理一维数据

    实现一维卷积神经网络的方法_卷积神经网络处理一维数据实现一维卷积神经网络1、准备IMDB数据fromkeras.datasetsimportimdbfromkeras.preprocessingimportsequencemax_features=10000max_len=500print(‘loadingdata……’)(x_train,y_train),(x_test,y_test)=imdb.load_data(num_words=max_feature)print(len(x_train),’trainse

    2022年9月22日
    4
  • python爬虫–scrapy(初识)

    python爬虫–scrapy(初识)

    2021年4月18日
    192
  • 3dslicer使用教程_c4d视图设置

    3dslicer使用教程_c4d视图设置一、3DViewer视图窗口控制                                    视角控制左边一块可以控制当前3Dviewer窗口中显示的图像的视角,共有8个方向视角,左L(Left)、右R(Right)、前 A(Anterior)、后 P(Posterior)、上S(Superior)、下I(Interior)。点击后可以将视角切换到对应的方向。置中将3D视图放…

    2025年8月12日
    3
  • SM4算法原理_sgp4算法

    SM4算法原理_sgp4算法前面的文章介绍了SM4算法的C语言实现,源码可见我的另一篇文章:https://blog.csdn.net/cg129054036/article/details/83012721;这篇文章介绍SM4算法原理,这部分可能会比较枯燥,但数学要求也不是太高。目录1.概述2.参数产生3.轮函数4.密钥扩展5.加密/解密过程1.概述2012年3月,国家密码管理…

    2022年10月5日
    3
  • 修改 css变量,通过CSS变量修改样式的方法示例

    修改 css变量,通过CSS变量修改样式的方法示例问题 js 怎么去修改 css 伪类样式呢 但是 js 并没有伪类选择器 那么该怎么办呢 网上有不少方法 比如通过切换元素的类 在 style 中动态插入新的样式等 那么这里再来一种方法 设置 css 变量 var 通过 js 去改变这个变量来实现 示例 改变 div 的 hover 背景色 root divHoverColo red div width 100px height 100px backgrou

    2025年9月23日
    3
  • Lucene.Net 2.3.1开发介绍 —— 三、索引(六)

    Lucene.Net 2.3.1开发介绍 —— 三、索引(六)

    2021年9月7日
    66

发表回复

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

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