【问题标题】:Strange behavior with NSString instance variableNSString 实例变量的奇怪行为
【发布时间】:2012-03-20 20:37:49
【问题描述】:

这是使用引用计数 (ARC) 的 iOS 程序中类定义的一部分:

@interface CapViewController : UIViewController 
{
    NSString *bottomBn;
    NSString *topBn;
}

@property (nonatomic, strong) NSString *bottomBn;
@property (nonatomic, strong) NSString *topBn;

@end

在实现中我综合了它们:

@implementation CapViewController

@synthesize bottomBn;
@synthesize topBn;

问题是当我尝试分配值时。如果我在类方法中逐步执行以下几行(第一次使用每个实例变量):

bottomBn = [NSString stringWithString:@"bottomBn"];        
topBn = [NSString stringWithString:@"topBn"];

第一行执行后,topBn 的值变为@"bottomBn",bottomBn 为 nil 第二行没有影响。

如果我更改了在类中定义实例变量的顺序,即:

NSString *topBn;
NSString *bottomBn;

那么第一个赋值无效,第二个赋值导致“topBn”被赋值给bottomBn。

使用局部变量,它按预期工作:

NSString *localbottomBn = [NSString stringWithString:@"defaultbottombutton"];        
NSString *localtopBn = [NSString stringWithString:@"defaulttopbutton"];

这对我来说似乎很奇怪。如有任何帮助,我将不胜感激。

【问题讨论】:

标签: objective-c ios nsstring


【解决方案1】:

您没有设置自动释放的字符串,您应该将字符串设置为:

self.bottomBn = [NSString stringWithString:@"bottomBn"];        
self.topBn = [NSString stringWithString:@"topBn"];

【讨论】:

  • 感谢您的回复。我进行了更改,但问题仍然存在。 Lloyd18 的回应是解决方案……调试器/监视窗口显示不稳定的值。 NSLog 显示了正确的值。话虽如此,我已经做出了您建议的更改以改进代码。谢谢!
【解决方案2】:

我对其他类型和对象(甚至 CGFloat 和 CGPoint)也有同样的问题。我认为问题出在调试器中。尝试通过调试器打印字符串而不是查看变量。对我来说 NSLog 函数打印出我的预期。

我不知道为什么调试器会有这种不可预测的行为(可能是一个错误),但现在我更喜欢“NSLog 调试”。好难过。

【讨论】:

  • 我不敢相信我在这上面花了这么多时间。你是绝对正确的。调试器窗口显示的值(即上面发布的值)与 NSLog 输出的值不同。当我通过 NSLog 打印时,我得到了我期望的确切值。
  • 是的,我花了几个小时也很紧张。我在上次 xCode 更新后才遇到这个问题,所以我认为这是苹果的错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-29
  • 2011-12-05
  • 1970-01-01
  • 1970-01-01
  • 2021-10-27
  • 2014-06-05
  • 2017-08-06
相关资源
最近更新 更多