Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 如何释放具有NStimer工作的对象_Iphone_Objective C - Fatal编程技术网

Iphone 如何释放具有NStimer工作的对象

Iphone 如何释放具有NStimer工作的对象,iphone,objective-c,Iphone,Objective C,我不想在[myview发行版]之前编写类似“myview.timer invalidate”的代码。 但如果计时器工作,我不能释放myview,因为计时器保留myview。 我该怎么办 我想使类“myview”变得简单,只需调用[myview init]和[myview release] myview.h myview.m contrllor.m 使计时器失效 当无效时,它将释放目标 添加到视图类: -(void)stop { [self.timer invalidate]; s

我不想在[myview发行版]之前编写类似“myview.timer invalidate”的代码。 但如果计时器工作,我不能释放myview,因为计时器保留myview。 我该怎么办

我想使类“myview”变得简单,只需调用[myview init]和[myview release]

myview.h

myview.m

contrllor.m

使计时器失效

当无效时,它将释放目标

添加到视图类:

-(void)stop
{
    [self.timer invalidate];
    self.timer = nil;
}

从您的
releaseMyView
方法中首先调用它<代码>[myView停止]

您可以使用类似dispose方法的方法。 您的控制器代码如下所示:

- (IBAction)releaseMyView {
    [myView removeFromSuperview];
    [myView dispose];
    [myView release];
}
和dispose方法将使计时器无效。这段代码非常明显,所以您可以在dispose方法中执行其他清理


另一种方法是,若视图仍然具有superview,则可以签入doAction方法。如果没有-使计时器无效。

重复计时器保留其目标。因此,如果使用重复计时器,则必须使其失效,且失效位置不得为
dealloc
<除非使计时器无效,否则不会调用代码>解除锁定。这就是
NSTimer
的设计方式。由于您有一个
start
方法,如果您正在寻找更可读的代码,您可以编写一个
stop
方法,该方法将使计时器无效。逻辑很简单:如果你已经开始,你需要停止

另一个选项是使用不同的对象作为计时器的目标,而不是
self
。然后,您可以在
dealloc
中使计时器无效。但这可能不值得付出努力

我想让类“myview”成为示例,只需调用[myview init]和[myview release]
- (void)viewDidLoad {
    MyView *my_view = [[MyView alloc] initWithFrame:CGRectMake(0, 0, 320, 100)];
    self.myView = my_view;
    [my_view release];

    [myView start];
    [self.view addSubview:myView];

    [super viewDidLoad];
}

- (IBAction)releaseMyView {
    [myView removeFromSuperview];
    [myView release];
}
-(void)stop
{
    [self.timer invalidate];
    self.timer = nil;
}
- (IBAction)releaseMyView {
    [myView removeFromSuperview];
    [myView dispose];
    [myView release];
}