Вы не должны использовать -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 или наоборот.