0

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

在 .h 文件中

NSString *test;

在 .m 文件中

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

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

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

4

3 回答 3

2

让我尝试更详细地解释它:

.h您在文件中有一个字符串变量。在视图中确实加载了您将其分配为:

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

这段代码中实际发生的是您的测试是一个自动释放的对象。当你使用 this 和 object 时allocinitthis 是自动释放的对象,将在你占用它的方法后释放内存。

为了避免这种情况,您可以通过创建属性来使用@Mehul 的解决方案。这违背了封装概念。有时你有一些你不想在类之外访问的对象,或者不想与对象一起显示。在这些情况下使用以下内容:

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

这将使您的字符串保持活力,直到您释放它。

还有一种方式不好用,但是想告诉大家,让大家更好的理解。使用

test = @"sample";

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

使用它会有无限retainCount的测试变量。您可以使用它来避免崩溃,但这不是可取的,因为正如我所说的那样,retaiCount您无法释放它并在使用后释放内存。所以早期的方法更正确。

这适用于所有使用类方法创建的自动释放对象,而不是使用init.

希望这会让你更清楚。

于 2012-08-01T11:43:14.533 回答
2

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

test像这样在文件中创建属性.h,,

@property(nonatomic,retain) NSString *test;

synthesize它在这样的.m文件中,

@synthesize test;

现在testself.test这样在.m文件中使用,

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

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

另一个解决方案就是retain那个test字符串ViewDidLoad,我认为这也会帮助你..

希望对你有帮助..

于 2012-08-01T11:36:05.790 回答
0

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

-(void)viewDidLoad {

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

}

于 2012-08-01T11:47:42.963 回答