2010-08-11 4 views
2

현재 당분간 4.x 이전 버전에서 지원해야하는 iPhone 응용 프로그램을 개발하고 있습니다.4.0/3.2 이전의 iOS 버전과 NSClassFromString의 문제를 지원합니다.

내가 뭔가 4.x 또는 특정 3.2을 사용할 때, 나는 주어진 클래스가 존재하는지 확인하는 일반적인 방법, 즉 사용합니다 :

if(NSClassFromString(@"SomeClass")) { 
    // do stuff here 
} 

이 대부분 그렇지 않은 경우를 제외하고, 작동을 . 설명해 드리죠 :

클래스와 같은 :

  • UIMoviePlayerViewController (만 사용할 수를 3.2 이상에서 설명서에 따라)
  • UIGestureRecognizer 서브 클래스 (UIPanGestureRecognizer 같은; 등 UITapGestureRecognizer를)

이전 버전의 비공개 API에서 이미 사용 가능한 것처럼 유효한 클래스를 실제로 확인합니다. 이 경우입니까, 아니면 뭔가 빠졌습니까?

NSClassFromString() 접근법은 실제로 Apple에서 권장하므로 실제로는 좋지 않습니다.

안전을 기하기 위해 현재 런타임에 클래스 존재 여부를 확인하는 대신 OS 버전을 확인하고 있습니다.

다른 사람이이 문제가 있습니까? 감사합니다. .

답변

0

OS 버전을 검사하는 것은 NSClassFromString (...)을 사용하는 것보다 낫습니다. 일부 클래스는 이미 4.0/3.2 이전 버전에 존재하기 때문입니다. 당신은 단지 이런 식으로 사용할 수 있습니다 :)

2

아니, 당신은 잘못하고있는 것은 아닙니다. 3.2/4.0에서 공개 된 많은 개인 클래스가 있습니다. 기존 기능을 노출하는 경우 큰 문제는 아니지만 클래스의 기능이 크게 변경되는 경우가 많습니다.

버전을 테스트하는 것만으로도 100 % 실행 가능한 작업을 수행 할 수 있습니다 (일반적으로 뺨을 대다하더라도). 이전 버전의 선택기가 객체가 공개 된 버전의 선택기와 동일하게 작동한다는 보장이 없기 때문에 특정 선택기를 테스트하는 것만으로는 충분하지 않을 수도 있습니다.

+0

실제로 개인 구현이있는 경우 Apple에서는 기능을 확인하기 위해 OS 버전을 확인하는 것이 좋습니다. 버전을 확인하는 것은 OS 3.2에서 변경된 축척 비율을보고하는 방식 때문에 UIScrollView에서 크기가 조정 된 뷰를 다시 렌더링 할 때도 필요합니다. –

+0

자세한 내용은 WWDC 세션 130 - "미래의 응용 프로그램 교정"비디오를 참조하십시오. –

0

MPMoviePlayerViewController의 경우 [MPMoviePlayerController instancesRespondToSelector:@selector(view)]을 사용합니다. 그것들은 동시에 추가되었고 같은 프레임 워크의 일부입니다.

때때로 애플은 이것을 문서화합니다. 예 : UINib에 대해서 당신은 [UINib respondsToSelector:@selector(nibWithNibName:bundle:)]을 확인해야한다고 생각합니다. 내가 이것을 어디에서 읽었는지 기억이 안납니다.

나는 실제로 NSClassFromString()을 사용하도록 권장하지 않았습니다. 보통 [AVCaptureSession class]과 같은 것을 사용하지만, 마찬가지로 [[[AVCaptureSession alloc] init...] autorelease]을 사용할 수도 있습니다. 존재하지 않는 weak-linked 심볼은로드시 NULL이됩니다. 이것은 AVCaptureSession Class-object가 Nil이되고, nil의 메소드가 아무것도하지 않고 nil을 반환한다는 것을 의미합니다.

버전 번호를 비교하려면 kCFCoreFoundationVersionNumber와 비교하는 것이 더 안정적인 방법입니다. 나는 4.0을 아직 보지 못했다. kCFCoreFoundationVersionNumber_iPhoneOS_3_2는 4.0 헤더에서 가장 높은 것으로 나타납니다.