【问题标题】:Change variable value from NSTimer从 NSTimer 更改变量值
【发布时间】:2011-12-01 11:45:55
【问题描述】:

我是 Cocoa/Objective C 的新手。我必须在 NSTimer 执行的每次迭代中更改全局 NSSTring 变量的值。我已经在文件顶部的 appdelegate.m 中声明了变量,所以它是全局的:

NSString *my_string = @"hello";

我打电话给NSTimer

[[NSTimer scheduledTimerWithTimeInterval:3.0 target:self selector:@selector(scan:) userInfo:nil repeats:YES] fire];

在扫描内部我将新值设置为my_string:

- (void) scan:(NSTimer *)timer{
    //some execution
    my_string = @"the new value";
}

但变量值总是相同的“hello”,内容不会改变。 是否有可能做到这一点?解决方案?

【问题讨论】:

  • 看起来您的代码应该可以工作。您在哪里检查并找到未更改的值?
  • 在每次执行扫描方法时,我都会使用断点或日志检查变量值,并且它始终被赋值为“hello”。相反,我想将变量值 my_string 永久更改为新值,以便我可以从同一个 .m 文件中的另一个函数中读取它。
  • 我认为显示的代码没有任何问题。是否可以看到整个“扫描”代码?
  • - (void) awakeFromNib { [[NSTimer scheduledTimerWithTimeInterval:3.0 target:self selector:@selector(scan:) userInfo:nil repeats:YES] fire]; } - (void) scan:(NSTimer *)timer{ NSString *string_2 = @"value calculated by previous computation"; if(string_2 != my_string){ my_string = string_2; } }

标签: objective-c cocoa xcode4 global-variables nstimer


【解决方案1】:

你不需要调用fire方法,定时定时器会在指定的时间间隔后自动触发。

另外,在 scan: 方法处设置断点来判断它是否被调用。

【讨论】:

    【解决方案2】:

    如果您在 .m 文件中声明 my_string 变量,那么其他文件将无法看到它(您 #import .h 文件而不是 .m)。您是否在同一个文件 (appdelegate.m) 中执行计时器操作?

    我建议不要使用这样的全局变量,因为随着项目的建立,它经常会混淆事物。您可以将其作为带有访问器的 ivar,或者作为带有静态访问器的 @implementation 块中的静态,以便您可以从任何地方访问唯一实例。

    您可以记录更改以确保它发生或设置断点。

    - (void) scan:(NSTimer *)timer{
        //some execution
        my_string = @"the new value";
        NSLog(@"Changed my_string to %@", my_string);
    }
    

    【讨论】:

    • 是的,计时器的内容在同一个 .m 文件中。每次我进入带有断点的计时器触发的扫描方法时,我都会看到变量 my_string 总是被赋值为“hello”而不是新值。
    猜你喜欢
    • 1970-01-01
    • 2022-12-05
    • 2013-09-25
    • 1970-01-01
    • 2011-10-23
    • 2018-07-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多