- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我遇到了一个尴尬的情况,我想要一个带有 NSTimer 实例变量的类,只要该类还活着,它就会重复调用该类的方法。出于说明目的,它可能看起来像这样:
// .h
@interface MyClock : NSObject {
NSTimer* _myTimer;
}
- (void)timerTick;
@end
-
// .m
@implementation MyClock
- (id)init {
self = [super init];
if (self) {
_myTimer = [[NSTimer scheduledTimerWithTimeInterval:1.0f target:self selector:@selector(timerTick) userInfo:nil repeats:NO] retain];
}
return self;
}
- (void)dealloc {
[_myTimer invalidate];
[_myTImer release];
[super dealloc];
}
- (void)timerTick {
// Do something fantastic.
}
@end
这就是我想要的。我不想在我的类上公开一个接口(interface)来启动和停止内部计时器,我只希望它在类存在时运行。看起来很简单。
但问题是 NSTimer 保留了它的目标。这意味着只要该计时器处于事件状态,它就会阻止该类被正常的内存管理方法释放,因为计时器已保留它。手动调整保留计数是不可能的。 NSTimer 的这种行为似乎很难将重复计时器作为 ivar,因为我想不出 ivar 应该保留其所属类的时间。
这让我不得不承担一些不愉快的职责,即想出一些方法在 MyClock 上提供一个接口(interface),允许类的用户控制计时器何时启动和停止。除了增加不必要的复杂性之外,这很烦人,因为让类实例的一个所有者使计时器无效可能会踩到另一个指望它继续运行的所有者的脚趾。我可以实现我自己的伪保留计数系统来保持计时器运行,但是,……真的吗?对于这样一个简单的概念,这是很多工作的方法。
我能想到的任何解决方案都感觉很老套。我最终为 NSTimer 编写了一个包装器,它的行为与普通 NSTimer 完全一样,但不保留其目标。我不喜欢它,如果有任何见解,我将不胜感激。
最佳答案
由计时器引起的保留循环令人头疼。我使用过的最不脆弱的方法是不保留计时器,但总是在使它无效时将引用设置为 nil。
@interface Foo : NSObject
{
__weak NSTimer *_timer;
}
@end
@implementation Foo
- (void) foo
{
_timer = [NSTimer ....self....];
}
- (void) reset
{
[_timer invalidate], _timer = nil;
}
- (void) dealloc
{
// since the timer is retaining self, no point in invalidating here because
// that just can't happen
[super dealloc];
}
@end
不过,最重要的是,您必须调用 -reset
才能释放 self
。一个解决方案是在 self
和 timer
之间设置一个代理。代理可以对 self
有一个弱引用,并简单地将定时器触发的调用传递给 self
。然后,当 self
被释放时(因为计时器不保留 self
也不保留代理),您可以在 中调用
。invalidate
>解除分配
或者,如果针对 Mac OS X,请打开 GC 并完全忽略这些废话。
关于objective-c - NSTimer 作为 self 定位的 ivar,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4687738/
注意:我在这个项目中使用 swift。 我目前正在开发我的第一个项目,如果在一段时间后没有按下按钮,我会尝试停止(无效)NSTimer。我找到了其他停止 NSTimer 的方法,但没有说明如何在一定时
我正在 Xcode4 中工作,在一个项目中,出于组织目的,我一直使用三个不同的 NSTimer,但我意识到,除了名称之外,计时器是相同的,因此很容易将所有三个计时器合并为一。对于我的项目来说,哪一个更
根据 Apple 文档,将同时使用 WKInterfaceTimer(Watch 本地,倒计时但在结束时不触发任何事件)和 NSTimer(在计时器结束时触发方法)。所以,我的 App Interfa
我目前正在尝试制作一个 queueHandler,它将一个对象数组作为输入,用于在一个简单的 Double 机器人上执行驱动命令。我目前正在尝试使用 GCD 以串行执行我的函数,但是当我在我的队列中使
有个问题...我有定时器 [NSTimer scheduledTimerWithTimeInterval:120
我创建了一个计时器, self.scanTimer = [NSTimer scheduledTimerWithTimeInterval:TIMEOUT_SECONDS target:self s
我尝试使用以下代码停止 NSTimer: - (void)viewDidLoad { [super viewDidLoad]; timer3 = [NSTimer timerWithT
我正在制作一个带有计时器的应用程序。我从给定时间开始计算分钟和秒,直到 0。发生这种情况时,我启动一个警报 View 。 我的结构是这样的: 主线程方法分配一个新线程并初始化它。线程的入口点(方法)有
好吧,这段代码非常基本。用户将答案输入文本框,如果等于“第一+第二”,他们就得到一分。然后,他们有 5 秒钟的时间回答下一个数学问题。如果他们这样做了,函数“doCalculation”将再次运行,他
我正在创建益智游戏应用程序,并使用 NSTimer 显示时间(即 01:20)。当应用程序进入后台时,NSTimer 会暂停,但即使应用程序处于后台状态,我也想继续它。 例如,当应用程序进入后台时,计
我有一个带有 NSTimer *myTimer; 变量的类。在某些时候我会这样做: myTimer = [NSTimer scheduledTimerWithTimeInterval:20 targe
Edit2:为什么在“doSomething”方法中只更新了进度而不是point0? 编辑:使用我拥有的代码。我知道我一定忽略了一些东西,但我就是找不到它。 我正在编写一个 iPhone 应用程序,它
我的应用是一款体育应用。即使在后台游戏也应该继续,我为此使用了 nstimer。但我无法在后台运行计时器。每当应用程序处于后台时,计时器就会停止,返回时它会从离开时的同一时间继续。 最佳答案 您无法在
它将不断倒计时并更新当前时间。任何人都知道如何解决这个问题?我不明白 NStimer 如何识别这样的日期格式:20110803 23:59:59 最佳答案 查找NSDateFormatter 。您可以
是否可以在主线程上运行由 nstimer 调用的选择器? NSTimer 在它自己的线程中生成。 我的结构是一个线程调用一个带有 nstimer 的方法,nstimer 调用一个执行一些更新的方法,但
我在我的应用程序中使用了很多计时器。用于记录时间、移动物体、淡入淡出等。我在不同时间、同一 View 中使用同一个计时器来实现多个目的。我应该如何正确声明和无效或释放我的计时器? Atm 我这样声明计
我正在尝试使用 iPhone SDK 3.0 在线程上运行 NSTimer。我认为我做的一切都是正确的(新的运行循环等)。如果我在 viewDidDissappear 上调用 [timer inval
这是让我困惑了一段时间的事情。 我有一个 NSTimer,添加到 currentRunLoop 中,如果我不保留它,它就会崩溃。 NSTimer *timer = [[NSTimer timerWit
当我们使用 NSTimer 时,一旦在上述时间间隔后调用回调,UI 是否会被阻塞? 最佳答案 这要看情况。大多数时候,这不会成为问题。 如果,但是,满足以下两个条件,NSTimer 将阻塞 UI 线程
我使用大约 20 个 UIImageView 的小型飞机图像(50x50 像素)在 iPhone 屏幕上制作简单的动画。动画是通过按计时器间隔移动 UIImageView center 属性来完成的。
我是一名优秀的程序员,十分优秀!