代码之家  ›  专栏  ›  技术社区  ›  CristiC jason.zissman

nsstring和retaincount问题

  •  0
  • CristiC jason.zissman  · 技术社区  · 14 年前

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

    @属性(非原子,保留)nsstring*filepath;

    在viewdidload中,我给它一个值,当我试图从我的一个自定义方法调用它时,它第一次工作,但第二次却崩溃了。在我看来,文件路径在第一次调用时自动释放。

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

    nsstring*path=[[[nsstring init]alloc]autorelease]; path=[filepath copy];

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

    好吧,我知道filepath会增加,因为[copy],但是为什么还要增加path变量呢? 为什么在第一种情况下它不起作用?

    1 回复  |  直到 14 年前
        1
  •  0
  •   mvds    14 年前

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

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

    毫无意义:首先分配一个nsstring,然后让 path 指向它。然后让路径指向其他东西。nsstring未使用(但将由autorelease清除)。

    我看到你进入 filePath 只是以它的名字,而不是通过getter/setter。如果你使用 self.filePath ,像

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

    然后由setter正确处理保留/发布业务。准确地说,两者之间的区别 filePath = ... self.filePath = ... 是后者吗 保留指定的对象。

    你真的不应该指望重新计数来调试事情,如果你不太自信,你知道在可可树下发生了什么。