在 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 中将静态函数声明为私有时的性能和安全问题的主要内容,如果未能解决你的问题,请参考以下文章

为啥不能在 Java 中将类声明为静态?

如何在 ios 中将数据类型声明为时间戳 - swift

如何使用 swift 在 UIResponder 子类中将属性重新声明为读写?

在 Swift 中将实例变量的属性保存到 Struct 的静态变量数组中

我可以在Java中的静态成员函数中声明一个静态变量吗?

在 swift 中将 AppDelegate 类声明为“final”是不好的做法吗?