Swift中静态属性与静态函数的差异咨询(附代码示例)
Swift中两种URLSessionConfiguration声明的核心差异
下面这两段代码,一个是带闭包初始化的静态存储属性,一个是静态函数,核心差异主要在这几个方面:
1. 实例创建时机与复用性
静态属性
sessionConfiguration:
它的闭包是懒加载且仅执行一次——第一次访问这个属性时,闭包才会运行生成URLSessionConfiguration实例,之后无论再访问多少次,都会直接返回已经创建好的那个对象,相当于实现了单例效果。
代码示例:static var sessionConfiguration: URLSessionConfiguration = { let myConfig = URLSessionConfiguration.default let base64LoginString = EndpointController.getBase64StringLoginWithUserAndPasswordV2() myConfig.httpAdditionalHeaders = ["Authorization" : base64LoginString] return myConfig }()静态函数
getURLSessionConfigurationDefault():
每次调用这个函数,都会完整执行一遍函数内部的代码,生成一个全新的URLSessionConfiguration实例,每次返回的都是独立的对象,不存在复用。
代码示例:static func getURLSessionConfigurationDefault() -> URLSessionConfiguration { let myConfig = URLSessionConfiguration.default let base64LoginString = EndpointController.getBase64StringLoginWithUserAndPasswordV2() myConfig.httpAdditionalHeaders = ["Authorization" : base64LoginString] return myConfig }
2. 状态更新的时效性
如果EndpointController.getBase64StringLoginWithUserAndPasswordV2()的返回值会变化(比如用户切换账号、授权token过期更新):
- 静态属性的配置不会自动更新,因为它只在第一次访问时获取一次授权字符串,后续一直用旧的
Authorization头。 - 函数每次调用都会重新获取最新的授权字符串,生成的配置始终是当前有效的状态。
3. 使用方式的简洁度
- 静态属性直接通过
你的类名.sessionConfiguration访问,语法更简洁,像读取普通变量一样。 - 静态函数必须通过
你的类名.getURLSessionConfigurationDefault()调用,需要加括号执行,是方法调用的形式。
4. 内存占用情况
- 静态属性初始化后,对应的
URLSessionConfiguration对象会一直驻留在内存中(只要类本身还在内存里),如果这个配置不常用,会造成不必要的内存占用。 - 函数生成的对象,在使用结束且没有其他强引用的情况下,会被Swift的ARC自动回收,不会长期占用内存。
内容的提问来源于stack exchange,提问作者fabiobh
相关产品推荐
相关产品推荐

