【问题标题】:class variable accessible at end of one function, and crashes on access at beginning of next类变量在一个函数结束时可访问,在下一个函数开始时访问崩溃
【发布时间】:2009-07-14 00:20:40
【问题描述】:

(在 iPhone Objective-C 中编程)

我创建了一个类级别的 NSString*,为其添加属性(非原子,保留)并合成代码,我可以使用 stringByAppendingString 函数无休止地修改字符串,并使用 NSLog 显示字符串就好了。所有这些都是在一个子类中完成的,被覆盖的 viewDidLoad 函数。当我在确定要在 tableView 的单元格中显示什么时尝试从 cellForRowAtIndexPath 函数访问相同的变量时,程序崩溃。谁有线索?

相关代码:

@interface InfoViewController : UITableViewController {
    NSString *shipAddr;
}
@property (nonatomic,retain) NSString *shipAddr;

@synthesize shipAddr;

VIEWDIDLOAD:

shipAddr = [[[NSString alloc] initWithString:@""] retain];

**在这里崩溃:

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    NSLog(shipAddr);

**

【问题讨论】:

    标签: iphone uitableview nsstring


    【解决方案1】:

    您实际上是双重保留原始字符串,这会泄漏它,但这不是您崩溃的原因。

    您正在崩溃,因为stringByAppendingString: 返回一个自动释放的字符串。因此,保留原件多少次都没关系;每次调用 stringByAppendingString:(或任何其他 stringByWhatever 方法)时,都会得到一个生命周期有限的新字符串。

    对于您的代码,我建议始终分配给self.shipAddr,并将@"" 分配给开头的字符串。 self.shipAddr 版本会自动为你处理内存管理。

    【讨论】:

      【解决方案2】:

      尝试将 NSLog 语句放在 viewDidLoad 和 tableView:cellForRowAtIndexPath: 方法的开头。如果后者先运行,那么它会在变量创建之前尝试访问它。

      如果你知道 shipAddr 应该足够早,我会把初始化放在你的 init 方法中。

      【讨论】:

        【解决方案3】:

        我假设您确实意识到 @synthesize 语句位于实现文件中,而不是标题中。

        同样在viewDidLoad,如果你必须这样做,我认为你可以这样做:

        self.shipAddr = @"";
        

        由于该属性已定义为保留传递的参数。

        我注意到的最后一件事是,我相信对 NSLog 的调用应该是这样的:

        NSLog(@"%@", shipAddr);
        

        函数格式如下:void NSLog(NSString *format, ...);

        是的,正如 Brent 提到的,因为 stringByAppendingFormat 返回一个自动释放的字符串,它可能在你用其他方法看到它之前就“消失”了。所以你应该使用这个:

        self.shipAddr = [shipAddr stringByAppendingFormat: blah blah];
        

        因为这使用了 shipAddr 的属性,正如您定义的那样,它保留传递的参数并处理问题。

        【讨论】:

          【解决方案4】:

          你确定 viewDidLoad 是在 tableView:cellForRowAtIndexPath: 之前调用的吗?听起来当您在该函数中引用该字符串时,该字符串要么未初始化,要么已释放。鉴于您在 viewDidLoad 中分配和保留字符串(您实际上不需要保留在那里),我会说它还没有被初始化!

          【讨论】:

            猜你喜欢
            • 2022-12-06
            • 1970-01-01
            • 1970-01-01
            • 2022-10-24
            • 2017-09-28
            • 1970-01-01
            • 2014-10-28
            • 2020-03-15
            • 2012-05-01
            相关资源
            最近更新 更多