我正在编写一个小实用程序类来获取运行我的应用程序的iOS版本。我认为,因为在我的应用程序运行时iOS版本不会改变,所以可以一次读取版本,缓存它然后返回缓存值(因为它需要字符串拆分,使用数组操作等)。一个好的地方可能是我的实用程序类的+load
方法:它只会被调用一次,我的getter中不需要任何额外的if
。这就是我想出的:
Utils.h:
#import <Foundation/Foundation.h>
@interface Utils : NSObject
/**
* Returnes a major part of the iOS version that runs on the current device.
* I.e. returns 8 for iOS 8.1.2
*/
+(int)iOSMajorVersion;
/**
* Returns a minor part of the iOS version that runs on the current device.
* I.e. returns 1 for iOS 8.1.2 or 0 for iOS 7.0.1.
*/
+(int)iOSMinorVersion;
@end
Utils.m:
#import "Utils.h"
#import <UIKit/UIKit.h>
@implementation Utils
static int minorVersion = -1;
static int majorVersion = -1;
+(void)readVersions {
NSArray *versions = [[[UIDevice currentDevice] systemVersion] componentsSeparatedByString:@"."];
majorVersion = [versions[0] intValue];
if (versions.count > 1) {
minorVersion = [versions[1] intValue];
}
else {
minorVersion = 0;
}
}
+(void)load {
[self readVersions];
}
+(int)iOSMajorVersion {
return majorVersion;
}
+(int)iOSMinorVersion {
return minorVersion;
}
@end
但后来我想:如果用户在我的应用运行时收到iOS更新怎么办?然后,设备将重新启动,但在更新后启动应用时会再次调用+load
?我的意思是,如果它是在更新之前运行的最后一个应用程序,iOS是否有可能以某种方式cache
运行时,并且不会再次重新初始化它?
从我的角度来看,应该重新初始化运行时。毕竟这是一个不同的运行时(iOS已经更新),但我只是出于好奇而想知道,如果有人确切知道的话。
感谢。
P.S。我知道这个“优化”不值得(这个功能在我的应用程序中不会经常使用),但它是我的个人项目,所以我也将它用于教育目的。此外,如果我写得好一次,我可以在以后重复使用它,而不用考虑这样的问题:)
P.P.S。出于显而易见的原因,我无法通过实验发现它。因此,我的问题。
答案 0 :(得分:2)
如果应用程序从设备的内存中删除,则需要重新加载代码资源,并再次调用+load
方法。真正的问题是,如果发生版本更改,应用程序将始终从内存中删除。到目前为止,安装更新时iOS会重新启动,但这并不是您应该依赖的东西。未来安全更新(例如)可能会作为快速补丁发布,可以更改iOS版本,但实际上并不需要重新启动系统或更改RAM状态。
虽然不太可能,但在应用程序完成启动或到达前台时(根据信息的含义)缓存此类信息会更好更安全。