在ARC下返回一个NSString *转换为CFStringRef - 如何摆脱分析器警告?

时间:2011-10-24 01:17:54

标签: iphone objective-c ios automatic-ref-counting core-foundation

这是我的功能:

CFStringRef nameWithType (someEnum type) {
  NSString* r;
  switch (type) {
    case type1:
      r=@"type1";
      break;
    case type2:
      r=@"type2";
      break;
    case type3:
      r=@"type3";
      break;
  }
  return (__bridge CFStringRef)r;  // analyzer warns: Address of stack memory associated with local variable 'r' returned to caller.
}

2 个答案:

答案 0 :(得分:4)

这将消除非常难以消除的分析仪警告。

CFStringRef nameWithType2(someEnum type){
    CFStringRef string = NULL;
    switch (type) {
        case type1:
            string = (__bridge CFStringRef)@"type1";
            break;
        case type2:
            string = (__bridge CFStringRef)@"type2";
            break;
        case type3:
            string = (__bridge CFStringRef)@"type3";
            break;
    }
    return string;
}

请记住不要让这个内存泄漏。

答案 1 :(得分:2)

实际上有“传统方式”(从NSObject之前的时间开始)到不使用NSString文字,而是使用CFSTR宏,如下所示:

CFStringRef nameWithType2(someEnum type){
    CFStringRef string = NULL;
    switch (type) {
        case type1:
            string = CFSTR("type1");
            break;
        case type2:
            string = CFSTR("type2");
            break;
        case type3:
            string = CFSTR("type3");
            break;
    }
    return string;
}

CFSTR(c_string)是创建CFStringRef的最短方法,比(__bridge CFStringRef)@"NSString"短得多

此外,如果有人看到这个代码,你会因为知道CFSTR而获得更高的极客。它有N00B来创建NSString文字,然后将其转换为CFStringRef并且需要添加ARC内存管理所有权转移标签....而不是立即创建CFStringRef。