2012-08-01 145 views
0

我在viewdidload方法中設置字符串的值,並在按鈕操作方法中獲取字符串值,導致應用程序崩潰。我可以知道崩潰的原因以及如何將值傳遞給方法。將值傳遞給另一個方法

在.m文件

-(void)viewDidLoad 
{ 
    test = [NSString stringWithFormat:@"sample"]; 
} 

-(IBAction) buttonPressed:(id)sender 
{ 
    NSLog(@"%@", test); 
} 

當我按下按鈕的應用程序崩潰.h文件中

NSString *test; 

+0

初始化.h文件中屬性還 – akk 2012-08-01 11:33:21

+0

什麼是控制檯消息當它崩潰? – 2012-08-01 11:34:43

+0

@RKK我初始化.h文件中的屬性並在.m文件中合成 – Bala 2012-08-01 11:36:28

回答

2

請嘗試使用這一解決方案,我認爲這會幫助你,

.h文件中像這樣創建的test地產,,

@property(nonatomic,retain) NSString *test; 

synthesize.m文件中像這樣,

@synthesize test; 

現在使用test作爲self.test這樣的.m文件,

-(void)viewDidLoad 
{ 
    self.test = [NSString stringWithFormat:@"sample"]; 
} 

-(IBAction) buttonPressed:(id)sender 
{ 
    NSLog(@"%@", self.test); 
} 

這另一種解決方案就是retaintest字符串中ViewDidLoad另外,我覺得這也將幫助你..

希望這將幫助你..

+0

非常感謝它的工作,我們也可以爲數組,字典等其他人使用相同的東西。 – Bala 2012-08-01 11:51:48

2

讓我試着解釋它更詳細:

你有一個字符串變量.h文件。鑑於沒有負載你賦值爲:

test = [NSString stringWithFormat:@"sample"]; 

在這段代碼實際上happning什麼是你的測試是一個自動釋放的對象。當你使用這個和對象沒有allocinit這是自動釋放對象,並將釋放內存後,你佔據它的方法。

爲避免這種情況,您可以使用@ Mehul的解決方案通過創建屬性。這是違反封裝的概念。有時你有不想在課堂以外訪問的對象,或者不想用對象顯示。使用在這些條件下:

test = [[NSString stringWithFormat:@"sample"] retain]; // or 
test = [[NSString alloc] initWithFormat:@"sample"]; 

這將讓您的字符串活着,直到你釋放它。

還有一種方法不好用,但想告訴你,這樣你就可以更好地理解它。使用

test = @"sample"; 

如果你不想追加字符串或格式,使用它,你可以簡單的字符串賦值給你NSString對象。

使用此將有一個無限retainCount您的測試變量。你可以使用它來避免崩潰,但這不是可取的,因爲正如我所說的那樣,有一個無限的retaiCount你不能釋放它,並在使用後釋放你的內存。所以更早的方法更加正確。

對於所有使用類方法創建的自動釋放對象,而不是使用init,這是正確的。

希望這會讓你更清楚。

+0

我可以釋放dealloc方法中的對象。 – Bala 2012-08-01 11:45:39

+0

是的你可以在dealloc方法中釋放它。但是你必須在'viewDidLoad'中分配內存時在'viewDidUnload'中完成。但請確保在'viewDidUnload'調用後,您不必以任何方式訪問此變量,甚至不使用委託方法。否則,你會因爲對象被釋放而崩潰。 :) – 2012-08-01 11:51:10

+0

謝謝kapil,mehul的答案解決了我的問題,我的答案再次向我提供了更多信息,感謝kapil。 – Bala 2012-08-01 11:55:59

0

我覺得簡單分配會解決問題。就在viewDidLoad方法

-(void)viewDidLoad { 

test=[[NSString alloc]initWithString:@"Sample"]; 

}將這段代碼

+0

@ mehul的答案解決了我的問題,謝謝user_aj我會嘗試urs並重播u。 – Bala 2012-08-01 12:05:22

相關問題