代码之家  ›  专栏  ›  技术社区  ›  0xced

核心基础对象的垃圾收集

  •  4
  • 0xced  · 技术社区  · 16 年前

    在这段代码上运行静态分析器:

    - (id) readForeignPref
    {
     CFPropertyListRef matchStyle = CFPreferencesCopyAppValue(CFSTR("PBXFindMatchStyle"), CFSTR("com.apple.Xcode"));
     return [(id)matchStyle autorelease];
    }
    

    产生以下警告:

    对函数“cfPreferencesCopyAppValue”的调用返回一个具有+1保留计数(拥有引用)的核心基础对象。核心基础对象不会自动垃圾回收。

    这是个警告吗?我应该用这样丑陋的东西来解决:

    - (id) readForeignPref
    {
     CFPropertyListRef matchStyle = CFPreferencesCopyAppValue(CFSTR("PBXFindMatchStyle"), CFSTR("com.apple.Xcode"));
     id nsMatchStyle = [(id)matchStyle copy];
     if (matchStyle) {
      CFRelease(matchStyle);
     }
     return [nsMatchStyle autorelease];
    }
    

    或者这只是一个误报,假设复制的对象是免费桥接的?

    1 回复  |  直到 16 年前
        1
  •  8
  •   kperryua    16 年前

    试试这个:

    - (id) readForeignPref
    {
          CFPropertyListRef matchStyle = CFPreferencesCopyAppValue(CFSTR("PBXFindMatchStyle"), CFSTR("com.apple.Xcode"));
          return [(id)CFMakeCollectable(matchStyle) autorelease];
    }
    

    没有 CFMakeCollectable ,这将在GC中泄漏,因为 CFRetain 与objc不同 -retain . 一 克弗兰 禁用该对象的垃圾回收,并需要 cfmakeCollectable可收集 使能。

    推荐文章