배경 :iOS 하위 호환성 - 존재하지 않는 클래스의 alloc/init
iOS 6 SDK를 사용하여 앱을 개발하고 있다고 가정 해 보겠습니다.
// method only available from 6, class of someObj existed in 5
if (someObj respondToSelector:@selector(aMethod)) {
[someObj aMethod];
}
또는
// entire class only available from 6
if (NSStringFromClass([SKStoreProductViewController class]) != nil) {
SKStoreProductViewController *store = [[SKStoreProductViewController alloc] init];
}
: 나는 내 배포 대상은 그때 6에서 기능을 사용하지만 5와의 호환성을 유지하기 위해 할 수 아이폰 OS 5 에 설정 한, 당신은 당신의 코드에서 어떤 검사를해야
지금까지 그렇게 좋았습니다. 내가 아는 한 이것들은 일을하는 표준 방법입니다.
그러나 새로운 클래스 예제에서, 내가 체크하고 그 클래스에서 객체를 할당/초기화하려고한다면, 예상했던 것보다는 오히려 반환할만한 iOS 5에서는 충돌이 일어나지 않는다는 것을 알았다. 없는.
// run this on an iOS 5 device
NSLog(@"%@", [UICollectionView alloc] init]);
iOS 5에서 충돌이 발생하지 않는 이유는 무엇입니까? 이것은 링커가 작동하는 방식과 관련이 있다고 생각하지만 심볼이 해당 버전에 존재하지 않기 때문에 충돌이 발생할 것으로 예상됩니다.
두 번째 질문은 정상적인 테스트가 NSStringFromClass 메서드를 사용하는 경우 존재하지 않는 클래스에 + 클래스 메서드를 보낼 수 있고 null을 반환한다는 것을 의미합니다. 왜 그런 식으로 작동합니까?
마지막으로, iOS 6에서만 정의 된 프로토콜을 채택하는 ViewController를 만들 수 있고 다시 5에서 문제가 발생하지 않는다는 것을 알았습니까?
그래도 난 여전히 프로토콜 상황에 관해서는 관심 - NS_CLASS_AVAILABLE이 적용하지 않는 것 같습니다. – Brynjar