문제

Ok I've been developing iphone-apps for over a year now, but there's this one thing which still really sucks.

Let's say I want to make my app compatible with iOS 3.0 I set my sdk to the newest version available and set my deployment target to 3.0

But what happens, if you by accident call a function available only in ... 3.1.x or later? Right, it simply crashes.

There are no warnings or indicators telling you, that a function is only available in later iOS-Version. And since the Emulator doesn't support versions < 4.0 it's impossible to test if the application really works. You can't even buy a new device since they already have a newer iOS installed. And even if you have an older device it's sometimes almost impossible to check each and every part of your code.

And I really need to support older versions since I know that my customers (around 2/3) still use 3.x versions.

Isn't there ANY code-analyzer or something that scans the availability of all functions called within the app?

In one case the app crashed because I called

+ (id)sortDescriptorWithKey:(NSString *)key ascending:(BOOL)ascending

which i a convenience method of alloc +

- (id)initWithKey:(NSString *)key ascending:(BOOL)ascending;

(Plus it's autoreleased) But sortDescriptorWithKey is only avaible in 4.0 @_@

도움이 되었습니까?

해결책

same question here. The only thing I figured out to set the Base SDK of Project AND Target to 3.0. Then the compiler will check if you call some not existing methods.

But the question for a scanner still exist because the method above throws me some errors when using the ASI HTTP framework. So my procedure is to

  1. change the SDK's to 3.0
  2. go through errors which underlie my own code
  3. change the methods to be 3.0 compatible
  4. set the project's Base SDK back to latest SDK

you probably have to install a SDK 3.0 from previous XCode version. And there is no need to set the target Base SDK back to latest version. I have once set it to 3.0 and get no errors from ASI HTTP.

//EDIT: download links for XCode 3.2.1: Snow Leopard and Leopard

다른 팁

Try to check by calling respondsToSelector method

if([your_obj respondsToSelector:@selector(sortDescriptorWithKey:ascending:)]){
  // call sortDescriptorWithKey
}
else
{
  // call another method
}

You will receive warnings while compiling but not crashes in run time.

Try using the guidelines established in the Apple's Framework/Weak-linking guide. for functions that you can't ask the objects like in @Andriy's answer.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top