【问题标题】:passing values to another method将值传递给另一个方法
【发布时间】:2025-11-26 19:50:01
【问题描述】:

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

在.h文件中

NSString *test;

在 .m 文件中

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

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

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

【问题讨论】:

  • 也初始化 .h 文件中的属性
  • 崩溃时的控制台消息是什么?
  • @RKK 我在.h文件中初始化属性并在.m文件中合成
  • @Phillip 没有控制台消息它是空的。

标签: iphone memory-management nsstring


【解决方案1】:

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

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

@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 ViewDidLoad 中的 test 字符串,我认为这也会对你有所帮助..

希望对你有所帮助..

【讨论】:

  • 非常感谢它的工作原理,我们也可以将相同的东西用于数组、字典等其他对象。
【解决方案2】:

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

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

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

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

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

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

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

还有一种方式不好用,但想告诉你,让你更好地理解。使用

test = @"sample";

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

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

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

希望这会让你更清楚。

【讨论】:

  • 我可以在dealloc方法中释放对象吗?
  • 是的,您可以在 dealloc 方法中释放它。但是您必须在viewDidUnload 中执行此操作,因为您在viewDidLoad 中分配内存。但请确保在调用viewDidUnload 之后,您不必以任何方式访问此变量,甚至不必使用委托方法。否则你会因为对象被释放而崩溃。 :)
  • 感谢 kapil,mehul 的回答修复了我,您的回答再次为我提供了更多信息,感谢 kapil。
  • 请注意,静态字符串(和类似对象)不会有无限保留计数。返回的保留计数为 -1,但它完全是类似于推荐的(但愚蠢的)单例模式的实现细节。
【解决方案3】:

我认为简单分配会解决这个问题。只需在 viewDidLoad 方法中替换这段代码

-(void)viewDidLoad {

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

}

【讨论】:

  • @mehul 的回答解决了我的问题,谢谢 user_aj 我也会尝试 urs 并重播你。