为什么内存消耗增长?

时间:2012-12-12 15:33:14

标签: objective-c ios memory-management

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

- (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。为什么?我怎么能避免呢?

3 个答案:

答案 0 :(得分: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];

答案 1 :(得分:0)

为避免无限循环,您应使用NSTimer和一个函数,在其中切换对象的状态。

在你的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

答案 2 :(得分:0)

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