-1

这是一段非常简单的代码:

- (void)functionOne
 {
   [self performSelector:@selector(functionTwo) withObject:nil afterDelay:1.0];
 }
- (void)functionTwo
 {
   [self performSelector:@selector(functionOne) withObject:nil afterDelay:1.0];
 }

正如您所看到的,这两种方法中没有什么会导致内存消耗的增长。但它会增长。非常缓慢,但确实如此。每三秒大约 0.01 MB。为什么?我怎样才能避免它?

4

3 回答 3

3

您正在有效地创建一个无限循环。如果您想每隔一秒切换一次对象的状态(正如您在评论中所说),请这样做:

像这样创建一个方法:

- (void)functionOne
{
    if( [obj isEqual:stateA] ) {
        obj = stateB;
    } else {
        obj = stateA;
    }
}

并用计时器调用它:

NSTimer* myTimer = [NSTimer scheduledTimerWithTimeInterval:1.0 target:self
                               selector:@selector(functionOne) userInfo:nil repeats:YES];
于 2012-12-12T15:46:36.523 回答
0

内存增长仅仅是因为应用程序需要保持某种状态。每次调用执行选择器时,选择器都会被压入堆栈。此堆栈保存在内存中。因此增长。

于 2012-12-12T15:52:46.697 回答
0

为避免无限循环,您应该使用 a NSTimerand one 函数,在其中切换对象的状态。

在您的 init 方法中,或者viewDidLoad您应该启动一个计时器,例如

- (void)viewDidLoad {
    [super viewDidLoad];
    [NSTimer scheduledTimerWithTimeInterval:1.0
        target:self
        selector:@selector(switchState:)
        userInfo:nil
        repeats:YES];
} 

然后你使用一种方法,比如

- (void) switchState:(NSTimer *)timer {
    if ([[self yourState] isEqual:stateOne]) {
        [self setYourState:stateTwo];
    } else {
        [self setYourState:stateOne];
    }
}

有关更多信息,请参阅http://developer.apple.com/library/ios/#documentation/cocoa/reference/Foundation/Classes/NSTimer_Class/Reference/NSTimer.html

于 2012-12-12T15:48:39.000 回答