Warunkowo ukryj kod z kompilatora
Oto problem. Ustawiam wkrótce wydanie aktualizacji dla systemu iOS, która będzie rozwiązywać pewne problemy w systemie iOS 7. Aby to zrobić, muszę użyć niektórych specyficznych funkcji / typów iOS 7. Dałem absolutną pewność, że kod iOS 7 zostanie wykonany tylko na iOS 7 i powróci do innego kodu dla pre iOS 7. Oczywiście nie mogę przesyłać z obecną wersją beta Xcode, więc staram się skompilować z aktualną wersją Xcode. Nie mogę jednak znaleźć sposobu na wyłączenie tego szczególnego ostrzeżenia:
Use of undeclared identifier '<Redacted>'.
Czy ktoś wie, jak wyłączyć to ostrzeżenie za pomocą#pragma
. Próbowałem kilka różnych, w tym
-w
, -Weverthing
, -Wall
ale nic nie działa.
AKTUALIZACJA Odpowiedź: Oczywiście nie możesz, ponieważ kompilator nie może skompilować identyfikatora, o którym nic nie wie. Moje rozwiązania polegały na stworzeniu#define
:
#define <redacted> 1
AKTUALIZACJA 2 Odpowiedź poniżej znacznie ułatwiła. Już stworzyłem#define Xcode5Code(code, alt)
co pozwoliło mi warunkowo wykonać bloki kodu. Modyfikując go za pomocą rozwiązania @maddy:
#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000
#define Xcode5Code(code, alt) code
#else
#define Xcode5Code(code, alt) alt
#endif
Pozwala mi to łatwo ukryć bloki kodu z kompilatora przy użyciu:
Xcode5Code({
//Code to be execute only with Xcode 5
}, {
//code to be executed in previous versions of Xcode
})
Główną zaletą korzystania z#define Xcode5Code
jest to, że Xcode automatycznie go uzupełni, co jest o wiele łatwiejsze niż pełne#if __IPHONE_OS_VERSION_MAX_ALLOWED >= 70000
, który Xcode nie zostanie automatycznie uzupełniony.
Nie rozróżni to urządzeń z systemem iOS 7 i pre iOS 7. Rozróżnia tylko to, która wersja systemu iOS może obsługiwać bieżący Xcode. Aby odróżnić wersje urządzeń z systemem iOS:
NSUInteger DeviceSystemMajorVersion(void) {
static NSUInteger _deviceSystemMajorVersion = -1;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_deviceSystemMajorVersion = [[[[[UIDevice currentDevice] systemVersion] componentsSeparatedByString:@"."] objectAtIndex:0] intValue];
});
return _deviceSystemMajorVersion;
}
Nawiasem mówiąc, powyższy kod firmy Apple. Aby trochę zatańczyć wokół NDA, powiem, że pomaga to w ustawieniu widoku kontrolera głównego, ponieważ zależy to zarówno od wersji używanego Xcode, jak i wersji systemu iOS na urządzeniu. A jeśli próbujesz zarządzać kodem beta i kodem produkcyjnym, może to bardzo pomóc. Po przesłaniu aplikacji z kodem Xcode 5#define Xcode5Code
nie będzie już konieczne.