首页 > 编程知识 正文

立么原理(performSelector 注意问题及原理)

时间:2023-05-06 09:20:55 阅读:123556 作者:3873

(首先,使用performSelector时请特别注意内存泄漏问题。 用以下代码表示。

创建要从上一个控制器推送至控制器的控制器ZWWTestThreadViewController,

ZWWLog宏定义:

#ifdefdebug#definezwwlog(fmt,) nslog ) ) ' %s[line%d]'fmt ),__PRETTY_FUNCTION__,_ _ line

- void (查看视频下载([ superviewdidload ]; zwwlog(@'retaincount=%LD ',cfgetretaincount ) ) _bridgecftyperef ); //performSelector调用方法[ selfperformselector : @ selector (testperformselectorfunc ) with object 3360 selfafterdelay 336010. zwwlog(@'retaincount=%LD ',cfgetretaincount ) ) _bridgecftyperef ); (void ) viewdiddisappear: ) bool ) animated ([ superviewdiddisappear 3360 animated ]; ZWWLog (; (//-) void ) testPerformSelectorFunc{ ZWWLog ); () void ) dealloc ) zwwlog(@ '对象将被销毁); zwwlog(@'retaincount=%LD ',cfgetretaincount ) ) _bridgecftyperef ); )情况1 )如果小于10s,请单击navigationbar上的“后退”按钮退出此界面并打印结果。

结果:

运行performSelector时,self.retainCount会增加。 暂且不论为什么是8,10,参考链接

2.testPerformSelectorFunc在viewDidDisappear之后运行。 也就是说,页面返回disappear后,不执行dealloc方法,不实际销毁控制器对象,并发生内存泄漏。 到达10s时间时,控制器已经disappear,但该页上的代码testPerformSelectorFunc方法也将运行,只有运行该方法才能运行dealloc方法并释放对象

情况2 )达到10s后,退出页面,打印结果:

结果:

viewDidDisappear会运行dealloc,从而真正释放对象。 运行dealloc时,reatainCount必须为1,以前有多少个reatainCount并不重要。 (请参阅链接)。

解决方法:

取消接口或控制器关闭时还不能执行的延迟函数。 代码很简单。

[ nsobjectcancelpreviousperformrequestswithtarget : self ]

当然,也可以一个个这样使用。

[ nsobjectcancelpreviousperformrequestswithtarget : self selector : @ selector (方法1: ) object:nil]

再加上这个,就会调用dealloc方法来解决问题!

在viewDidDisappear方法中编码[ nsobjectcancelpreviousperformrequestswithtarget : self ];

-(void ) viewdiddisappear:(bool ) animated ([ superviewdiddisappear 3360 animated ] zw wlog (; [ nsobjectcancelpreviousperformrequestswithtarget : self ] }执行结果:

结论:可以看到,在低于10s时退出控制器不会立即执行dealloc方法,销毁对象,并且testPerformSelectorFunc不会在viewDidDisappear之后运行

2 )谈谈性能选择器的原理和使用方法

从上面的viewDidLoad可以看出,我们调用方法(发送消息)时经常直接调用方法,这与performSelector有什么区别?

- void (查看视频下载([ superviewdidload ]; zwwlog(@'retaincount=%LD ',cfgetretaincount ) ) _bridgecftyperef ); //performSelector调用方法[ selfperformselector : @ selector (testperformselectorfunc ) with object 3360 selfafterdelay 336010. zwwlog(@'retaincount=%LD ',cfgetretaincount ) ) _bridgecftyperef ); } 1、performSelector负责系统在运行时查找方法,编译时不进行任何检查; 直接调用编译时会自动验证。 如果testPerformSelectorFunc方法不存在,则可以在编译时检测直接调用,但使用performSelector始终在运行时检测。 在这种情况下,程序将崩溃。 Cocoa支持在运行时将方法添加到类中。 也就是说,在编译方法时不存在,但在运行时存在。 在这种情况下,必须使用performSelector进行调用。 因此,使用performSelector时,为了程序健壮性,是一种检查方法(- (BOOL ) respondstoselector: ) sel ) aSelector;

2、直接调用方法时,必须在头文件中声明该方法的使用,头文件也必须导入。 此外,如果使用performSelector,则可以直接在performSelector中调用它,而无需在import头文件中使用包含方法的对象。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。