【问题标题】:NSString and retainCount questionNSString 和 retainCount 问题
【发布时间】:2011-03-28 14:49:25
【问题描述】:

我在接口部分声明了一个 NSString:

@property (nonatomic, 保留) NSString *filePath;

在 viewDidLoad 我给它一个值,当我试图从我的一个自定义方法中调用它时,它第一次工作,但第二次它崩溃了。在我看来,filePath 在第一次通话期间自动释放。

我尝试了一种不同的方法,在我的方法中我做了这样的事情:

NSString *path = [[[NSString init] alloc] autorelease]; path = [文件路径副本];

这一次似乎有效,但是在检查路径的 retainCount 时,它会不断增加。 第一次调用该方法时,retainCount 为 4,但第二次为 2,第三次为 3,依此类推。

好的,我理解 filePath 会增加,因为 [copy] 但为什么还要增加路径变量? 为什么在第一种情况下它不起作用?

【问题讨论】:

    标签: iphone xcode nsstring retaincount


    【解决方案1】:

    您没有显示所有代码,因此很难说出任何结论。然而:

    NSString *path = [[[NSString init] alloc] autorelease];
    path = [filePath copy];
    

    没有意义:首先你分配一个 NSString,然后让path 指向它。然后你让 path 指向别的东西。 NSString 没有被使用(但会被自动释放清理掉)。

    我看到您只是通过名称访问filePath,而不是通过 getter/setter。如果你使用self.filePath,喜欢

    self.filePath = [NSString stringWithFormat:@"..."]; // or any other string
    

    然后设置器正确处理保留/释放业务。准确地说,filePath = ...self.filePath = ... 的区别在于后者保留你正在分配的对象。

    如果您不太确定自己知道可可引擎下发生的事情,那么您真的不应该查看 retainCount 来调试。

    【讨论】:

    • 感谢您的回答,我正在努力学习。我发现自己处于以下情况: > NSDateFormatter *date_formater=[[NSDateFormatter alloc]init]; [date_formater setDateFormat:@"yyyy-MM-dd"]; NSLog(@"数据计数:%i",[self.data retainCount]); self.data = [date_formater stringFromDate:[NSDate date]]; [date_formater 发布]; NSLog(@"数据计数:%i",[self.data retainCount]);为什么结果是:> 数据计数:0 数据计数:2 提前谢谢您。
    • 虽然这实际上是一个新问题,应该作为一个问题(或者,当相关时,合并到您的原始问题中)答案是 self.data 是一个保留属性,所以它保留在分配,并且 [date_formatter stringFromDate:...] 返回保留计数为 1 的字符串,因此总共为 2。 (当你的函数完成后,它将再次为 1,因为 stringFromDate 将它添加到自动释放池中)
    猜你喜欢
    • 1970-01-01
    • 2011-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-11-10
    • 2011-08-21
    • 2023-03-11
    • 1970-01-01
    相关资源
    最近更新 更多