Преобразование приложения iOS5 в ARC - PullRequest
0 голосов
/ 06 ноября 2011

Я интегрирую сторонний код в свое приложение и одновременно пытаюсь преобразовать приложение в ARC.

Я прилагаю скриншот, чтобы показать только две ошибки. Если для кого-то очевидно, как перекодировать этот раздел, я был бы очень признателен.

enter image description here

Мне нужно решить еще одну питу. Какой самый прагматичный способ решить эту проблему:

value =  (NSString *)CFURLCreateStringByReplacingPercentEscapesUsingEncoding(kCFAllocatorDefault,
                                                                                             (CFStringRef)value,
                                                                                             CFSTR(" "),
                                                                                             kCFStringEncodingUTF8);

Это дает эту ошибку:

"Приведение типа указателя Objective C 'NSString *' к типу указателя C 'CFStringRef' (он же const struct __CFString * ') требует мостового приведения"

Еще раз спасибо .. Я потеряю этот код как можно скорее ...

Ответы [ 3 ]

2 голосов
/ 06 ноября 2011

Вы не должны использовать -performSelector: в любом случае. Вместо этого используйте objc_msgSend(target, selector, ...). Если вы звоните -respondsToSelector:, вы можете просто использовать [vc setDelegate:self.delegate] после оператора if. То же самое относится и к первой строке. Заменить его на:

UIViewController *vc = [vcClass alloc]; // vc = [[vcClass alloc] initWithSomething:[specifier file] ...]; if the initSelector is known at compile time

Если initSelector генерируется динамически:

objc_msgSend(vc, initSelector, [specifier file], ...);

Надеюсь, это поможет.

Обновление: ответ на второй вопрос

Если вы переносите объекты CF в объекты Objective-C, ARC необходимо знать, как обрабатывается управление памятью. Вы должны вставить __bridge, __bridge_retained или __bridge_transfer перед кастом:

NSString *value;
value = (__bridge_transfer NSString *)CFURLCreateStringByReplacingPercentEscapesUsingEncoding(kCFAllocatorDefault, (__bridge CFStringRef)value, CFSTR(" "), kCFStringEncodingUTF8);

Вы используете __bridge, если вы хотите только привести между CF и Objective-C, __bridge_retained, если это сохраненное значение, и вы обрабатываете это позже, используя CFRelease и __bridge_transfer, если вы хотите перенести объект из CF в Objective-C или наоборот.

1 голос
/ 06 ноября 2011

Единственная причина, по которой вы когда-либо использовали бы executeSelector: это когда селектор генерируется динамически, если вы знаете, какой селектор вы собираетесь использовать, тогда вы должны его использовать, так что executeSelector: @selector (alloc) не имеет абсолютно никакого смысла .

1 голос
/ 06 ноября 2011

Вы должны использовать обычный обмен сообщениями objc, а не performSelector: повсюду, как это.

Также вы должны:

  • установить vc в результатеинициализатора.
  • не нужно сообщать release (или вызывать [obj performSelector:@selector(release)];) в программе ARC - компилятор справится с этим за вас.

Одна последняя основная проблемав том, что инициализатор не должен использовать такой селектор.Если вам действительно нужна эта форма, рассмотрите возможность использования / передачи удобного конструктора вместо селектора инициализации.

...