NSMutableString“超出范围”

时间:2010-03-27 13:04:54

标签: iphone objective-c nsmutablestring

我在viewController中定义了两个NSMutableString对象(UITableViewController的子类).h文件:

NSMutableString *firstName;
NSMutableString *lastName;

它们是属性:

@property (nonatomic, retain) NSMutableString *firstName;
@property (nonatomic, retain) NSMutableString *lastName;

我在.m文件中合成它们。

在我的viewDidLoad方法中 - 我将它们设置为空字符串:

firstName = [NSMutableString stringWithString:@""];
lastName = [NSMutableString stringWithString:@""];

firstName和lastName可由用户更改。在我的cellForRowAtIndexPath方法中,我试图显示这些字符串的内容:

cell.detailTextLabel.text = [NSString stringWithFormat:@"%@ %@", firstName, lastName];

但是这会导致应用程序在显示视图控制器后立即崩溃。使用调试器,似乎firstName和lastName都是“超出范围”或者它们不存在。我是Xcode的新手,但调试器似乎停在了objc_msgSend。

我做错了什么?

5 个答案:

答案 0 :(得分:6)

问题在于您需要:

self.firstName = ...
self.lastName = ...

这将调用自动生成的setter方法,这将保留值。通过直接分配,你绕过了setter,一旦当前自动释放池被耗尽,这两个变量就会有悬空指针。

答案 1 :(得分:1)

习惯于self.variableName ...而不是stringWithsString尝试使用initWithString ...希望它能解决问题...顺便说一句,你已经很好地解释了这个问题...

答案 2 :(得分:0)

您的单元格正在加载并在初始化之前访问firstName和lastName。 viewDidLoad为时已晚,请尝试使用awakeFromNib或viewWillLoad或iPhone上的任何内容。

答案 3 :(得分:0)

你不能使用:

firstName = [NSMutableString stringWithString:@""];

因为viewDidLoad执行完成后会立即解除分配。

尝试:

firstName = [[NSMutableString alloc] initWithString:@""];

或者:

[self setFirstName:[NSMutableString stringWithString:@""]];

不要忘记在firstName消息上发布lastNamedealloc

答案 4 :(得分:0)

你用过什么样的细胞样式?

if (cell == nil) {
  cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle 
                                 reuseIdentifier:BasicCellIdentifier] autorelease];
}

也许这会对你有帮助