您的位置:首页 > 移动开发 > Objective-C

NSObject详解

2015-06-25 10:09 561 查看
循环调用自身方法,可延时

- (void)performSelector:(SEL)aSelector withObject:(id)anArgument afterDelay:(NSTimeInterval)delay;

知识点:这个方法是单线程的,也就是说只有当前调用此方法的函数执行完毕后,selector方法才会被调用。

- (void)mainMethod
{
[self performSelector:@selector(delayMethod) withObject:nil afterDelay:1];

NSLog(@"调用方法==开始");

sleep(5);

NSLog(@"调用方法==结束");
}

- (void)delayMethod
{
NSLog(@"执行延迟方法");
}

执行结果(注意log打印的顺序):

调用方法==开始
调用方法==结束
执行延迟方法


实战经验:正因为本方法是一个单线程的,所以有些时候,我们会遇到虽然调用了这个方法,但是不执行的问题。这时,我们需要将原代码改造如下:

改造前代码:无法执行延迟方法

-(void)someMethod
{

[self performSelector:@selector(labelDidDisappeared:) withObject:label afterDelay:2];   //因为某些原因,不被调用,没有执行

}

-(void)labelDidDisappeared:(UILabel *)label

{
[label removeFromSuperview];

[label release];
}


改造后代码: 可以正常执行延迟方法

-(void)someMethod
{
//关键
[self performSelectorOnMainThread:@selector(labelWillDisappeared:) withObject:label waitUntilDone:NO];

}

-(void)labelWillDisappeared:(UILabel *)label
{
[self performSelector:@selector(labelDidDisappeared:) withObject:label afterDelay:2];
}

-(void)labelDidDisappeared:(UILabel *)label
{
[label removeFromSuperview];
[label release];
}


知识扩展:以下两个方法均是多线程方法

- (void)performSelectorInBackground:(SEL)aSelector withObject:(id)arg



- (void)performSelectorOnMainThread:(SEL)aSelector withObject:(id)arg waitUntilDone:(BOOL)wait;

参考:/article/8666053.html
感谢原作者的无私和奉献!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: