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等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)