我在viewdidload
方法中设置字符串的值,并在应用程序崩溃的按钮操作方法中获取字符串值。我可以知道崩溃的原因以及如何将值传递给方法。
NSString *test;
<。>文件中的
-(void)viewDidLoad
{
test = [NSString stringWithFormat:@"sample"];
}
-(IBAction) buttonPressed:(id)sender
{
NSLog(@"%@", test);
}
当我按下按钮时,应用程序崩溃。
答案 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"];
在这段代码中真正感兴趣的是你的测试是一个自动释放的对象。当你使用这个和没有alloc
和init
的对象时,这是一个自动释放的对象,并会在你占用它的方法之后释放内存。
为了避免这种情况,您可以通过创建属性来使用 @ 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"];
}