将值传递给另一个方法

时间:2012-08-01 11:27:34

标签: iphone memory-management nsstring

我在viewdidload方法中设置字符串的值,并在应用程序崩溃的按钮操作方法中获取字符串值。我可以知道崩溃的原因以及如何将值传递给方法。

<。>文件中的

NSString *test;
<。>文件中的

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

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

当我按下按钮时,应用程序崩溃。

3 个答案:

答案 0 :(得分:2)

请尝试使用此解决方案,我认为这会对您有所帮助,

test文件中创建.h的属性,如下所示

@property(nonatomic,retain) NSString *test;

synthesize.m文件中,就像这样,

@synthesize test;

现在在.m文件中使用test作为self.test,就像这样,

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

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

另一种解决办法就是retain test ViewDidLoad中的{{1}}字符串,我认为这也可以帮助你..

希望这会对你有帮助..

答案 1 :(得分:2)

让我试着更详细地解释一下:

.h文件中有一个字符串变量。在视图中加载您将其指定为:

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

在这段代码中真正感兴趣的是你的测试是一个自动释放的对象。当你使用这个和没有allocinit的对象时,这是一个自动释放的对象,并会在你占用它的方法之后释放内存。

为了避免这种情况,您可以通过创建属性来使用 @ Mehul的解决方案。这是针对封装概念。有时你有不想在课堂外访问的对象或者不想用对象显示。在这些条件下使用以下:

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

这将使你的琴弦保持活着直到你释放它。

还有另一种不好用的方法,但想告诉你,这样你就能更好地理解它。使用

test = @"sample";

如果您不想附加字符串或将其与格式一起使用,则可以将简单字符串分配给NSString对象。

使用它将拥有测试变量的无限retainCount。你可以使用它来避免崩溃,但这不是优选的,因为我告诉它有一个无限retaiCount你不能释放它并在使用后释放你的记忆。所以早期的方法更正确。

对于使用类方法而不是init创建的所有自动释放对象都是如此。

希望这会让你更加清楚。

答案 2 :(得分:0)

我认为简单分配将解决问题。只需在viewDidLoad方法中替换此代码

即可
-(void)viewDidLoad {

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

}