基于iOS版本的不引人注目的运行时预定义值

基于iOS版本的不引人注目的运行时预定义值,ios,objective-c,Ios,Objective C,是否有任何方法可以基于iOS版本为我的应用程序设置未缓存且几乎(如果不是完全)预定的值,而无需在运行时手动调用初始化代码 我不是在寻找一种解决方案,它要求我在应用程序运行时不断检查操作系统,或者必须在运行时通过AppDelegate调用来初始化许多全局变量。编译时无法检查系统版本。这些信息根本不存在 由于您希望避免在整个应用程序运行过程中多次重新检查,因此您所能做的最好的事情就是在流程生命周期的早期检查并存储该信息。这可能是您的应用程序代理的适当任务。当您获得应用程序:didFinishLaun

是否有任何方法可以基于iOS版本为我的应用程序设置未缓存且几乎(如果不是完全)预定的值,而无需在运行时手动调用初始化代码


我不是在寻找一种解决方案,它要求我在应用程序运行时不断检查操作系统,或者必须在运行时通过AppDelegate调用来初始化许多全局变量。

编译时无法检查系统版本。这些信息根本不存在

由于您希望避免在整个应用程序运行过程中多次重新检查,因此您所能做的最好的事情就是在流程生命周期的早期检查并存储该信息。这可能是您的应用程序代理的适当任务。当您获得
应用程序:didFinishLaunchingWithOptions:
时,请执行常规运行时检查,并将结果提供给其他任何需要它的控制器。或者让每个关心的控制器在创建时进行检查


您还可以创建一个带有
constructor
属性的函数,该函数将在非常早的时候运行——实际上是在
main()
之前。这可以简单地用系统版本初始化一个全局变量,然后您可以在任何地方访问它。

根据@JoshCaswell的建议,我尝试了以下方法:

static BOOL iOS6OrGreater;

__attribute__((constructor))
static void iOS6OrGreaterInitialization(){iOS6OrGreater = [[[UIDevice currentDevice] systemVersion] compare:@"6.0" options:NSNumericSearch] != NSOrderedDescending;}

static int MY_DEFINED_ENUM_NAME(){return (iOS6OrGreater) ? IOS6_OR_GREATER_ENUM : IOS5_OR_LESSER_ENUM;}

但是,我发现,
“UITextAlignmentCenter”已被弃用:首先在iOS 6.0中弃用。
警告。

编译时不存在有关系统运行代码的信息。怎么可能呢?“你看到了吗?”乔什·卡斯韦尔我很抱歉弄糊涂了。我并不期望进行实际的编译时检查,但需要一些替代方法。我只是不想在需要枚举值的时候经常检查iOS版本。你的问题似乎要问预处理器宏多次——你多次提到它们。如果你在寻找替代品,你应该说得更清楚。当然,我理解,但你的问题现在看起来像是“我的医生说我的饮食需要更多钾,但我讨厌香蕉,那么我应该吃什么样的香蕉?”当你真的想要一个香蕉以外的选择时,我认为这也是一个有效的问题;我只是想解释一下,根据你的评论,你似乎在寻找的东西与问题不符。也许我没有很好地解释……你的意思是在方法声明之前的行中添加:
\uuuuuuu attribute\uuuuuu((构造函数))
?这是否会导致函数在应用程序加载任何内容之前运行,这样我就不必检查值是否已初始化,而只需相信它已初始化,因为它已在对其进行任何调用之前运行?该属性在方法上不起作用;它必须是一个函数。是的,正如我所说,该函数将在
main()
之前运行,因此在
UIApplicationMain()
之前,以及在您的任何其他代码之前运行。这甚至可能太早了;我不能100%确定
UIDevice
是否会被初始化。你得试试。啊!正确的。使用方法是没有意义的,因为我不需要任何实例。那么这对我来说肯定会很好。我将编辑我的问题,以反映我从所有这些中得到了什么。@joshcas正如我在中所证明的,您可以在
\uuuu属性(构造函数))
函数中使用objc类。@Daij Djan它将起作用(我使用构造函数创建UIView子类),并且我已经证明它是可靠的,在模拟器和设备上:。只需抑制警告:@RichardJ.RossIII谢谢!我还遇到了一个
值转换问题
,但我不知道警告标志的名称是什么。既然我不想抑制所有警告,那么我该如何抑制它呢?如果不抑制它,应该将值强制转换到
int
@RichardJ.RossIII I was,但是当我获取值时,我忘了声明它是一个带括号的函数。这是一个愚蠢的错误。