在 Swift 中将静态函数声明为私有时的性能和安全问题
Posted
技术标签:
【中文标题】在 Swift 中将静态函数声明为私有时的性能和安全问题【英文标题】:Performance and secure issue when declaring static function as private in Swift 【发布时间】:2018-01-25 06:51:23 【问题描述】:我有一个结构类,用于存储有关手机和应用程序属性的数据,例如 screenResolution、PhoneModel、ApplicationInstalledDate、wifiDetailInfo。它只会在应用打开时声明一次。我想为每个属性编写函数,因为会有 30 个属性,并且在 init 方法中我想调用每个函数来声明属性。当我搜索时,我不能像这样直接做
property = self.function()
所以我将函数声明为私有静态,如下面的代码所示。
我的问题是;
1-) 当我声明和调用这样的函数时,它们会以异步方式工作吗?如果不是,这将是一个性能问题,因为我在应用程序启动(AppDelegate)上调用这些并且我不确定它们是否会影响应用程序打开时间。
2-) 此外,我的应用程序需要安全。也许这是一个愚蠢的问题,但我想到了一些东西。如果我将一个函数声明为静态,即使它是私有的,在逆向工程并尝试更改或获取一些数据时是否更容易到达?
struct DeviceDataModel
let applicationInstalledDate: String
//Continue
init?()
applicationInstalledDate = DeviceDataModel.getApplicationInstalledDate()
private static func getApplicationInstalledDate() -> String
let urlToDocumentsFolder = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).last!
//installDate is NSDate of install
return (try! FileManager.default.attributesOfItem(atPath: urlToDocumentsFolder.path)[FileAttributeKey.creationDate] as! String)
【问题讨论】:
【参考方案1】:没有函数是异步的,除非你这样定义它。因此,如果这些函数是由您定义的,并且您没有使它们异步(通过在后台线程上执行并调用回调以通知其完成),它们就不是异步的。查看this article 和this article,了解有关异步方法的一些见解。
关于第二个问题 - 访问修饰符与面向对象编程中的 encapsulation and abstraction 有关 - 与应用程序的安全性关系不大的概念 - 我不认为创建函数 private
而不是 internal
(没有修饰符)会使逆向工程代码变得更加困难。
我能想象到的唯一可能影响这一点的情况可能是使用public
/open
,因为这样就可以在模块外部访问这些函数而无需任何逆向工程工具——但这需要攻击者添加该应用程序作为依赖项(他可以这样做,但我相信有更详细的方法来逆向工程应用程序代码)。
【讨论】:
以上是关于在 Swift 中将静态函数声明为私有时的性能和安全问题的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 swift 在 UIResponder 子类中将属性重新声明为读写?