gpt4 book ai didi

ios - objc_getAssociatedObject 总是返回 nil

转载 作者:搜寻专家 更新时间:2023-11-01 06:14:06 26 4
gpt4 key购买 nike

我正在尝试将属性添加到 Timer 的扩展中使用关联对象,但函数 objc_setAssociatedObject总是返回 nil .

Timer is a NSObject所以这应该有效。

代码:

extension Timer {
private struct AssociatedKeys {
static var counterAddress = "counter_address"
}

public var repeatCounter: Int {
get {
return objc_getAssociatedObject(self, AssociatedKeys.counterAddress) as? Int ?? 0
}
set {
objc_setAssociatedObject(self,
AssociatedKeys.counterAddress,
newValue,
.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
}
}

知道为什么这不起作用吗?


更多代码:

@nonobjc public class func new(every interval: TimeInterval, _ block: @escaping (Timer) -> Void) -> Timer {
var timer: Timer!
timer = CFRunLoopTimerCreateWithHandler(kCFAllocatorDefault, CFAbsoluteTimeGetCurrent() + interval, interval, 0, 0) { _ in
print("timer: \(timer.numberOfRepeats), : \(timer.repeatCounter), : \(timer)")
if timer.numberOfRepeats > 0 {

if timer.repeatCounter > timer.numberOfRepeats {

timer.invalidate()
return
} else {

timer.repeatCounter += 1
}
}

block(timer)
}
return timer
}

所以有些问题是我没有使用相同的计时器对象。还有一些问题:

  1. static let repeatCounterAddress = "repeat_counter_address"有时未初始化且具有空字符串值。

  2. 有时我会得到相同的关联值,有时则不会。

最佳答案

尝试以下操作(注意&符号):

extension Timer {
private struct AssociatedKeys {
static var counterAddress = "counter_address"
}

public var repeatCounter: Int {
get {
return objc_getAssociatedObject(self, &AssociatedKeys.counterAddress) as? Int ?? 0
}
set {
objc_setAssociatedObject(self,
&AssociatedKeys.counterAddress,
newValue,
.OBJC_ASSOCIATION_RETAIN_NONATOMIC)
}
}
}

它始终确保相同的地址 被指定为key 参数的值。如果您仅使用字符串值,则每次调用 objc_getAssociatedObjectobjc_setAssociatedObject 时,其原始值可能不同。

您可以使用以下代码进行检查:

func test(_ a: UnsafeRawPointer) {
print("\(a)")
}

let a = "abc"

test(a)
test(a)
test(a)
test(a)

这打印

0x00006040004427e0
0x00006040004427e0
0x0000608000052980
0x0000600000055c50

例如,不同的原始指针被解释为不同的关联对象。

关于ios - objc_getAssociatedObject 总是返回 nil,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48730663/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com