【问题标题】:NSMutable String "Out of scope"NSMutable 字符串“超出范围”
【发布时间】:2010-03-27 13:04:53
【问题描述】:

我在 viewController(UITableViewController 的子类).h 文件中定义了两个 NSMutableString 对象:

NSMutableString *firstName;
NSMutableString *lastName;

它们是属性:

@property (nonatomic, retain) NSMutableString *firstName;
@property (nonatomic, retain) NSMutableString *lastName;

我在 .m 文件中合成它们。

在我的 viewDidLoad 方法中 - 我将它们设置为空白字符串:

firstName = [NSMutableString stringWithString:@""];
lastName = [NSMutableString stringWithString:@""];

firstName 和lastName 可以由用户更改。在我的 cellForRowAtIndexPath 方法中,我试图显示这些字符串的内容:

cell.detailTextLabel.text = [NSString stringWithFormat:@"%@ %@", firstName, lastName];

但这会导致应用程序在视图控制器显示后立即崩溃。使用调试器,似乎 firstName 和 lastName 都“超出范围”或者它们不存在。我是 Xcode 的新手,但调试器似乎在 objc_msgSend 处停止。

我做错了什么?

【问题讨论】:

  • 那么在哪里:NSMutableString *firstName; NSMutableString *lastName;定义?,在文件级别,或类级别,或在方法?仅供参考,顺便说一句,添加objective-c标签是对的,因为这绝对是“经典”的Objective-C。

标签: iphone objective-c nsmutablestring


【解决方案1】:

问题是你需要做的:

self.firstName = ...
self.lastName = ...

这将调用自动生成的 setter 方法,该方法将保留值。通过直接赋值,你绕过了 setter,一旦当前的自动释放池被耗尽,这两个变量就会有悬空指针。

【讨论】:

    【解决方案2】:

    养成使用self.variableName...而不是stringWithsString的习惯,尝试使用initWithString...希望它能解决问题...顺便说一句,您已经很好地解释了这个问题...

    【讨论】:

      【解决方案3】:

      您的单元格在初始化之前正在加载和访问 firstName 和 lastName。 viewDidLoad 为时已晚,请尝试 awakeFromNib 或 viewWillLoad 或 iPhone 上的任何内容。

      【讨论】:

      • 这将使值为零,这不会给出预期的字符串,但也不会崩溃。
      • 'Out of scope' 不是 nil,这意味着编译器还没有为有问题的变量分配任何值,无论是否为 nil。
      【解决方案4】:

      你不能使用:

      firstName = [NSMutableString stringWithString:@""];
      

      因为它会在viewDidLoad 执行完成后立即解除分配。

      试试:

      firstName = [[NSMutableString alloc] initWithString:@""];
      

      或者:

      [self setFirstName:[NSMutableString stringWithString:@""]];
      

      别忘了在dealloc 消息上发布firstNamelastName

      【讨论】:

        【解决方案5】:

        你使用了什么单元格样式?

        if (cell == nil) {
          cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle 
                                         reuseIdentifier:BasicCellIdentifier] autorelease];
        }
        

        也许这会对你有所帮助

        【讨论】:

          猜你喜欢
          • 2021-12-30
          • 2012-06-23
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-09-30
          • 2015-03-31
          • 2016-05-18
          相关资源
          最近更新 更多