1

我已阅读关于ARC的概念以及我们如何使用@property来定义strongweak引用。我的问题是如何做一个定义或者当他们都在里面方法的空闲指针和我想的范围结束这样的存储器,可尽快回收,因为这ARC内部方法创建指针

- (void) SomeMethod { 
    NSString* databasePath = [[NSString alloc] initWithString: [docsDir stringByAppendingPathComponent: @"contacts.db"]]; 
    .... 
    .... 
    } 

我的问题是我怎么释放字符串databasePath

+0

看看这里:https://developer.apple.com/library/mac/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html#//apple_ref/doc/uid/20000994-BAJHFBGH TL;您不必为此烦心,ARC会为您解除分配数据库路径。 –

回答

1

除非一些实例变量的....码商店databasePath,为字符串的内存将尽快为您分配nildatabasePath,或者让变量超出范围回收。你不需要为它做任何特别的事情,因为你使用了alloc/init

故事是自动释放的对象略有不同,即

NSString* databasePath = [NSString stringWithString: [docsDir stringByAppendingPathComponent: @"contacts.db"]]; 

此字符串将呆在身边,直到运行循环到达递减引用计数,除非你单独的自动释放池里面创建它。因此,只需将databasePath设置为nil就不足以立即释放内存:您需要在自己的变量周围放置一个自动释放池,以便立即释放内存。

+0

让我看看我是否得到这个正确的如果没有强指针指向它。如果由init和alloc分配,指针指向的内存会自动回收?自定义对象怎么样? alloc和init有什么特别之处。感谢 –

+0

@JamesFranco'alloc/init'没有什么特别之处,autorelease有一些特殊的东西,当一个对象被创建时引用计数为1而不是零。发生这种情况时,自动释放池会进入画面,因此该对象不会立即释放。这也不是全部故事,因为编译器有时会尝试优化autorelease池的行程,即使对于自动释放对象,但它对于实际正在进行的操作来说是一个体面的工作近似。 – dasblinkenlight

2

当你声明一个局部变量时,它默认标记为强引用。当所有对var的强引用都丢失时,内存将被释放。因此,在外部范围内,您的变量内存会自动释放,因为强大的引用在范围内。