【问题标题】:NSInteger always zeroNSInteger 始终为零
【发布时间】:2012-01-16 23:04:23
【问题描述】:

我有一个始终返回零的 NSInteger :( 我将其声明为:

NSInteger level;
@property(nonatomic, assign) NSInteger level;

合成:

@synthesize fileName, filePath, theActualIndexPath, titleBar, level;

那么当使用NSLog(@"%d", level) 时总是返回0,即使是在

level++; 

或者

level += 1;

我做错了什么?我 100% 肯定会在 level 上加 1,但不明白出了什么问题:(

编辑:

我使用这个 NSInteger 的 if 语句

if (level == 0) {
    self.navigationItem.title = @"Test";

} else {
    self.navigationItem.title = self.titleBar;

}

总是在第一个结束,即使加了 1

【问题讨论】:

  • 您是否检查过您的 RAM 是否损坏?否则,当您提供给我们的所有信息都正确时,这不会发生。
  • 嗯我怀疑它被破坏了,因为 OS X 和所有应用程序似乎都可以正常工作。我唯一一次使用 0 是在 if 语句和 NSLog 上,当然还有在尝试求和时,但这不起作用:(
  • 显示@synthesize statement 和其他方法围绕设置和显示级别。
  • 我认为问题不在于那几行代码。您是否尝试过更改编译器(从 gcc 到 llvm 或其他方式)?清洁和建造?构建和分析?
  • 我认为问题在于我尝试使用多级导航控制器。为此,我再次分配了相同的视图控制器,并且我认为正在重新分配级别整数

标签: objective-c cocoa-touch int nsinteger


【解决方案1】:

你为什么要声明level 两次?

删除此行:NSInteger level;

level 的第一个声明是一个全局范围的变量,第二个是类的实例变量。根据您的范围,由++level 递增的level 与由NSLog("%d", level); 打印并由if (level == 0) 测试的level 不同。

编辑

是的。如果您分配视图控制器的另一个实例,为什么您会期望 level 不会被新分配?如果你想这样做,那么你要么必须创建变量static,它在同一个类的实例之间共享它,要么确保你做这样的事情:

MyViewController *newViewController = [[MyViewController alloc] init]; // However this goes
newViewController.level = oldViewController.level; // Make sure you pass the level on

【讨论】:

  • 我认为问题在于我尝试使用多级导航控制器。为此,我再次分配了相同的视图控制器,并且我认为 level 整数正在重新分配
【解决方案2】:

被更改的变量与被访问的变量不同(在if 语句中)。

在控制台中打印level 的值和地址,包括设置它的位置(之前和之后)以及访问 s 的位置(在if 语句中。

【讨论】:

  • 我认为问题在于我尝试使用多级导航控制器。为此,我再次分配了相同的视图控制器,并且我认为正在重新分配级别整数
【解决方案3】:

试试这个:
在.h

@property(nonatomic) NSInteger level; // not an object assign not needed

在.m中

@synthesize level = _level;  
self.level = self.level + 1;  // and try this

并删除该行

NSInteger level;

这行得通吗?

【讨论】:

  • 删除声明NSInteger level;有副作用,调试器中将无法使用level(或推荐的_level)的值。
  • 还是不行,把变量名改成folderLevel,还是不加一个:/
  • 为什么'folderLevel'是一个危险信号?
  • folderLevel 是一个整数,用于跟踪我的应用所具有的文件夹层次结构的级别
  • @zad0xsis 你需要发布更多的代码,因为有很多可能出错的地方,而你的一小段代码没有显示出来。使用我的代码,如果您在没有 self 的情况下直接测试 level,则绝对需要使用 self,它将无法正常工作。并且按照惯例,您应该始终使用 self.aProperty 而不是一直绕过您的访问器。 (在您需要直接访问的自定义访问器中除外)
猜你喜欢
  • 2016-05-02
  • 2020-01-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-10
相关资源
最近更新 更多