ios定时器userinfo怎么用

ios定时器userinfo怎么用,第1张

ios定时器userinfo的使用方法

NSNotificationCenter 这个类是一个通知中心,使用单例设计,每个应用程序都会有一个默认的通知中心。用于调度通知的发送的接受。

// 注册通知观察者的方法

- (void)addObserver:(id)observer

selector:(SEL)aSelector

name:(nullable NSString )aName

object:(nullable id)anObject;

// 发送通知消息的方法

- (void)postNotification:(NSNotification )notification;

- (void)postNotificationName:(NSString )aName

object:(nullable id)anObject;

- (void)postNotificationName:(NSString )aName

object:(nullable id)anObject

userInfo:(nullable NSDictionary )aUserInfo;

// 移除观察者的方法

- (void)removeObserver:(id)observer;

- (void)removeObserver:(id)observer

name:(nullable NSString )aName

object:(nullable id)anObject;

通知的使用流程

1、定义一个事件到来时该执行的方法:

// 接收通知事件的类必须实现一个拥有以下特征的通知处理器方法:

// - (void)方法名:(NSNotification )通知;

- (void)execute:(NSNotification )notification {

// do something when received notification

// notificationname is @"NOTIFICATION_NAME"

if(notificationobject &&

[notificationobject isKindOfClass:[Test class]]) {

// do something

}

}

2、注册观察者:

NSNotificationCenter ncenter = [NSNotificationCenter defaultCenter];

[ncenter addObserver:self

selector:@selector(execute:)

name:@"NOTIFICATION_NAME"

object:nil];

使用默认的通知中心,上面代码的意义的:观察者 self 在收到名为 @"NOTIFICATION_NAME" 的事件时执行 @selector(execute:),最后一个参数是表示会对哪个发送者对象发出的事件作出响应,nil 时表示接受所有发送者的事件。

类似iOS中的NSTimer 定时器功能,开关控制随机几秒钟执行指定功能;

平台:Android

开发环境:android Studio

代码实现:

一 创建Handler对象和Runnable对象

[java] view plain copy print

Handler handler = new Handler();

Runnable runnable = new Runnable() {

@Override

public void run() {

if (mPageOpen){

if (interstitialAdisLoaded()){ //示例-谷歌插页广告

interstitialAdshow();

}else {

AdRequest adRequest = new AdRequestBuilder()build();

interstitialAdloadAd(adRequest);

}

int random = (int)(Mathrandom() 10 +20)1000; //随机时间循环执行

handlerpostDelayed(this, random);

}

}

};

二 开关控制

[java] view plain copy print

Switch mSwith = (Switch) findViewById(RidswitchPage);

mSwithsetOnCheckedChangeListener(new CompoundButtonOnCheckedChangeListener() {

@Override

public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {

if (isChecked) {

mPageOpen = true;

} else {

mPageOpen = false;

}

handlerpostDelayed(runnable, 15000); //开关控制执行

}

});

三 移除定时器

[java] view plain copy print

handlerremoveCallbacks(runnable);

1) 你期望 tableView canPerformAction: 支持自定义选择器,而该文档说它支持的只有两个UIResponderStandardEditActions (复制和粘贴) ;

2) 有没有需要的部分 || action == @selector(test:) ,您要添加的自定义菜单选项通过初始化 menuItems 属性。这项选择器检查将是自动的。

你能做什么来获取自定义显示的菜单项和工作是:

1) 修复的表视图委托的方法

) a

UIMenuItem testMenuItem = [[UIMenuItem alloc] initWithTitle:@"Test" action:@selector(test:)];

[[UIMenuController sharedMenuController] setMenuItems: @[testMenuItem]];

[[UIMenuController sharedMenuController] update];

b)

- (BOOL)tableView:(UITableView )tableView shouldShowMenuForRowAtIndexPath:(NSIndexPath )indexPath {

return YES;

}

-(BOOL)tableView:(UITableView )tableView canPerformAction:(SEL)action forRowAtIndexPath:(NSIndexPath )indexPath withSender:(id)sender {

return (action == @selector(copy:));

}

- (BOOL)tableView:(UITableView )tableView performAction:(SEL)action forRowAtIndexPath:(NSIndexPath )indexPath withSender:(id)sender {

return YES;

}

2) 设置单元格 (创建子类 UITableViewCell ) 与

-(BOOL) canPerformAction:(SEL)action withSender:(id)sender {

return (action == @selector(copy:) || action == @selector(test:));

}

-(BOOL)canBecomeFirstResponder {

return YES;

}

/// this methods will be called for the cell menu items

-(void) test: (id) sender {

}

-(void) copy:(id)sender {

}

创建一个计时器就行了。

例:

验证60秒

int timeTick;

NSTimer timer;

timeTick = 61;//60秒倒计时

timer=[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timeFireMethod) userInfo:nil repeats:YES];

_butenabled = NO;

-(void)timeFireMethod

{

timeTick--;

if(timeTick==0){

[timer invalidate];

_butenabled = YES;

[_but setTitle:@"获取验证码" forState:UIControlStateNormal];

}else

{

NSString str = [NSString stringWithFormat:@"%d秒",timeTick];

[_but setTitle:str forState:UIControlStateNormal];

}

}

上面代码就是实现了一个倒计时60秒的功能。

-- :表示弱引用。

-> :表示强引用。

循环引用可以简单理解为对象A引用了对象B,而对象B又引用了对象A:A -> B -> A,此时双方都同时保持对方的一个引用,导致任何时候双方的引用计数都不为0,双方始终无法释放就造成内存泄漏。

当然不只是两个对象之间相互引用会形成循环引用,多个对象之间相互引用最终形成环同样会形成循环引用。

例如:A->B->C->->X->B。

循环引用对 app 有潜在的危害,会使内存消耗过高,导致内存泄漏,性能变差和 app 闪退等。

block 、 delegate 、NSTimer

selftableViewdelegate = self;

如果 delegate使用strong修饰就会构成循环引用:self -> tableView -> delegate -> self。

所以在定义delegate属性时使用weak便能解决这一问题:self -> tableView -- delegate -> self。tableView和delegate之间不是强引用,所以构不成循环。

规避delegate循环引用的杀手锏也是简单到哭:定义delegate属性时请用assign(MRC)或者weak(ARC),千万别手贱玩一下retain或者strong。

(1)并不是所有block都会产生循环引用,block是否产生循环引用是需要我们去判断的,例如

(2)self -> reachabilityManager -> block -> self,才会产生循环引用,并且XCode给出了循环引用warning,例如

(3)解决block循环引用的方法是使用__weak修饰self,然后在block里使用被修饰后的weakSelf来代替self:

1、合适的时机启动和销毁 NSTimer

解决 NSTimer 的循环引用,我们首先会想到的方法应该是在 OneViewController dealloc 之前就销毁 NSTimer,这样循环就被打破了。

最简单的方法就是在 viewWillAppear 中启动 NSTimer,然后在 viewWillDisappear 中销毁 NSTimer,成对出现,绝对没有问题。

2、Effective Objective-C ”中的52条方法

计时器保留其目标对象,反复执行任务导致的循环,确实要注意,另外在dealloc的时候,不要忘了调用计时器中的 invalidate方法。

>

创建一个计时器就行了。

例:

验证60秒

int timeTick;

NSTimer timer;

timeTick = 61;//60秒倒计时

timer=[NSTimer scheduledTimerWithTimeInterval:1 target:self selector:@selector(timeFireMethod) userInfo:nil repeats:YES];

_butenabled = NO;

-(void)timeFireMethod

{

timeTick--;

if(timeTick==0){

[timer invalidate];

_butenabled = YES;

[_but setTitle:@"获取验证码" forState:UIControlStateNormal];

}else

{

NSString str = [NSString stringWithFormat:@"%d秒",timeTick];

[_but setTitle:str forState:UIControlStateNormal];

}

}

上面代码就是实现了一个倒计时60秒的功能。

以上就是关于ios定时器userinfo怎么用全部的内容,包括:ios定时器userinfo怎么用、android studio怎么编写计时器、如何释放含有NSTimer的UITableViewCell等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/9489346.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-04-28
下一篇 2023-04-28

发表评论

登录后才能评论

评论列表(0条)

保存