NSString实例变量的奇怪行为

时间:2012-03-20 20:37:49

标签: objective-c ios nsstring

以下是使用引用计数(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"];

这对我来说似乎很奇怪。我很感激任何帮助。

2 个答案:

答案 0 :(得分:7)

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

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

答案 1 :(得分:0)

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

我不知道为什么调试器有这种不可预测的行为(可能是一个bug),但现在我更喜欢“NSLog调试”。很遗憾。