возвращение NSString *, приведенного к CFStringRef под ARC - как избавиться от предупреждения анализатора? - PullRequest
1 голос
/ 24 октября 2011

Вот моя функция:

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 ]

4 голосов
/ 24 октября 2011

Это избавит от очень трудно устранить предупреждение анализатора.

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;
}

Только не забудьте не дать этой утечке памяти.

2 голосов
/ 21 декабря 2012

На самом деле существует «традиционный способ» (с того времени, когда существовал 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 сразу.

...