2010-03-27 77 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]; 
} 

也許這將幫助你

相關問題