swift – 错误:尝试将堆栈放在不可读的内存中:
我正在尝试向UIViewController添加其他属性.
码: protocol AdditionalStoredProperties { associatedtype Title func getAssociatedObject<Title>(key: UnsafePointer<Title>,defValue : Title)->Title } extension AdditionalStoredProperties { func getAssociatedObject<Title>( key: UnsafePointer<Title>,defValue : Title)->Title { guard let actual_value = objc_getAssociatedObject(self as! AnyObject,key) as? Title else { return defValue } return actual_value } } extension UIViewController:AdditionalStoredProperties { typealias Title = String var previousPage : String { get { return getAssociatedObject(&self.previousPage,defValue: self.previousPage) } set { objc_setAssociatedObject(self,&self.previousPage,newValue,.OBJC_ASSOCIATION_RETAIN)} } } 但是我收到以下错误: 错误:尝试将堆栈放在不可读的内存中: 我知道我们不能直接将存储的属性添加到扩展,所以我尝试使用objc_setAssociatedObject()添加它 解决方法
你正在做的事情有很多问题:
>尝试在自己的getter中访问self.previousPage将递归调用自身. 记住这些要点,这是您的代码的固定版本: protocol AdditionalStoredProperties : class { func getAssociatedObject<T>(ofType: T.Type,key: UnsafeRawPointer,defaultValue: @autoclosure () -> T) -> T } extension AdditionalStoredProperties { func getAssociatedObject<T>(ofType: T.Type,defaultValue: @autoclosure () -> T) -> T { // or: return objc_getAssociatedObject(self,key) as? T ?? defaultValue() guard let actualValue = objc_getAssociatedObject(self,key) as? T else { return defaultValue() } return actualValue } } extension UIViewController : AdditionalStoredProperties { private enum AssociatedObjectKeys { static var previousPage: Never? } var previousPage: String { get { // return the associated object with a default of "" (feel free to change) return getAssociatedObject(ofType: String.self,key: &AssociatedObjectKeys.previousPage,defaultValue: "") } set { objc_setAssociatedObject(self,&AssociatedObjectKeys.previousPage,.OBJC_ASSOCIATION_RETAIN) } } } 请注意,我们是: >使用静态存储属性以获取指针值以用作关联对象的键.再次,这是因为Swift guarantees stable and unique pointer values for static and global stored variables.>使用@autoclosure作为defaultValue:参数,因为如果已存在关联对象,则可能不需要对其进行求值.>使用key:参数获取UnsafeRawPointer,因为指针对象的类型无关紧要;它只是内存中用作密钥的位置.>使用ofType:参数明确地满足通用占位符.这主要是一个偏好问题,但我更喜欢明确地拼写这些东西,而不是依赖于类型推断.>使用camelCase而不是snake_case,就像Swift惯例一样. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |