调用[myString release]不会减少[myString retainCount]

Rob*_*art 2 iphone objective-c nsstring ipad

我有以下情况,这似乎导致我的iPad应用程序泄漏内存.

我有一个字符串属性的类...

@property(nonatomic,retain) NSString * synopsis;
Run Code Online (Sandbox Code Playgroud)

我从一些HTTP响应中设置字符串属性,来自JSON或XML响应.

此时,概要对象的保留计数为1.

但我有这种情况:

我将概要保存到本地sqlite数据库,然后我想从内存中释放它,但我有一种奇怪的情况,[synopsis release]从我的对象内部调用不会将保留计数减少到0.

(void) save
{
  NSLog(@"synopsis before save retainCount=%d",[synopsis retainCount]);
  [self saveToDb:synopsis withKey:@"synopsis"];
  NSLog(@"synopsis after save retainCount=%d",[synopsis retainCount]);
  [synopsis release];
  NSLog(@"synopsis after release retainCount=%d",[synopsis retainCount]);
  synopsis=nil;
}
Run Code Online (Sandbox Code Playgroud)

在控制台中,我得到:

synopsis before save retainCount=1

synopsis after save retainCount=1

synopsis after release retainCount=1
Run Code Online (Sandbox Code Playgroud)

这怎么可能?我在模拟器或设备上运行相同的结果.

mip*_*adi 10

不要相信RETAINCOUNT!

对于人类来说,它不是对象所有权的准确度量.你不知道框架中的调用retainrelease幕后操作是什么.

Cocoa中的内存管理很简单:

  1. 如果你alloc/ initcopy一个物体,请确保你release在某个时候给它打电话.
  2. 如果你想保留一个物体,请打电话retain- 但也要确保release在某个时刻打电话.

  • 请把你的第一句粗体.如果可以的话,增加字体大小.如本例所示,retainCount绝对没有用作调试工具. (3认同)