2010-03-27 78 views
2

我在我的viewController的(的UITableViewController的子类).h文件中定义了两个的NSMutableString对象:NSMutable字符串 “超出范围”

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。

我在做什么错?把self.variableName的......,而是stringWithsString尝试使用initWithString ...希望它会解决这个问题的

+0

那么在哪里: 的NSMutableString *的firstName; NSMutableString * lastName; 定义?,在文件级别,还是在Class级别,或者在Method中? 只是FYI你是正确的添加objective-c标签顺便说一句,因为这绝对是“经典”Objective-C。 – Wintermut3 2010-03-27 13:08:39

回答

6

的问题是,你需要做的:

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

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

1

化妆习惯......顺便说一句,你已经解释这个问题非常好...

0

你的电池是装并在初始化之前访问firstName和lastName。 viewDidLoad太晚了,请尝试awakeFromNib或viewWillLoad或iPhone上的任何东西。

+0

这将使值为零,这不会给预期的字符串,但也不会崩溃。 – smorgan 2010-03-27 13:12:40

+0

'超出范围'不是零,这意味着编译器还没有到处指定任何值,无或不是,还有问题的变量。 – 2010-03-27 20:09:42

0

不能使用:

firstName = [NSMutableString stringWithString:@""]; 

由于它会收回尽快viewDidLoad执行完毕。

尝试:

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

或者:

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

而且不要忘了在dealloc消息发布firstNamelastName

0

你使用了什么样的格式?

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

也许这将帮助你

相关问题