2012-08-01 138 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

相关问题