- 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/
在我将一个对象分配给该对象可能已经分配给的 ivar 的情况下,首先检查它是否已经分配给该 ivar 有什么好处。 例如,代码 A 相对于代码 B 有什么好处吗? 一个 if (ivar != anO
我一直想知道为什么所有苹果代码示例都使用这样的代码: UINavigationController *aNavigationController = [[UINavigationController
aclass.h @interface aClass : NSObject { NSString *name; } @property (nonatomic, retain) IBOutlet
如果我有一个具有两个属性“a”和“b”的类,并且我有一个这些类实例的数组。创建仅包含“a”元素的数组的最佳方法是什么。 最佳答案 最简单的方法是Key-Value Coding : [yourArra
@property(nonatomic)ivar 和 @property(nonatomic,assign)ivar 相同还是不同? 最佳答案 如 docs 中所述: assign - Specifi
这是后续问题:Difference between self.ivar and ivar? : self.name = @"hello"; 我想知道神奇 setter 方法内部做了什么。所以问题是:任
即使我们不拥有(分配/新建/复制)那个 ivar,我们也必须在 dealloc 中释放 ivar 吗? 例如,这是正确的吗? -(void)dealloc { [_aUIImageIvar r
根据Objective-C runtime reference : ivar_getOffset Returns the offset of an instance variable. ptrdiff
我可以在类之外定义@some_ivar。这个 ivar 属于哪个类,它的范围是什么? 例如,我可以在 example.rb 中说 @var = "Hi" 在 irb 中,我可以要求 example.r
我写了以下 objective-c 类.. @interface thumb_user_info : NSObject { @public // Otherwise I was not able to
毫无疑问,关于 iOS 中的内存管理有大量的信息。在阅读了大量相关内容后,我仍然不清楚某些情况下的“最佳”实践。请我对下面两个示例进行澄清... 我有一个 NSMutableArray,它充当 tab
我必须调用一个重复出现的方法,或者换句话说,该方法将调用自身。 同时我必须有一个方法将使用的控制变量。 首先,我会想到声明一个类似 controlIndex 的 ivar,然后在方法中使用它,如下所示
我正在尝试调用函数,但出现错误: warning: passing argument 1 of 'drawPlot' from incompatible pointer type //call
我在接口(interface)上声明了这样一个ivar: BOOL controllerOK; 我必须在自身位于 block 中的 block 中使用此 ivar。有点像 myBlockl = ^()
我发现很多时候我想要一个合成的只读属性,我只是根据其他变量实现该属性的 getter 方法,而不需要 ivar,例如 (注意:我在界面中定义了 ivars,因为我使用的是 OmniGraffle UM
我正在对 UIToolbar 进行子类化,因为我要在我的整个应用程序中重复使用它。 UIToolbar 使用委托(delegate)协议(protocol): // // UIToolbarCusto
我的应用程序中有一个相当大的 View Controller ,我想通过将一些功能分成几类来清理它。我阅读了有关如何实现类别的内容,并且: #import "StatsVC.h" @interface
当我需要一个私有(private)对象时,我目前使用属性,如下所示: // Class extension in .m file @interface MyClass() @property (str
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: How does an underscore in front of a variable in a coc
我遇到过 Objective-C 代码,它在 .m 文件的 @implementation 行下方声明一个变量,而不是在 .h 文件的 @interface block 中。然后它继续像私有(priv
我是一名优秀的程序员,十分优秀!