1

如果我沒有使用過「objc_setAssociatedObject」一個目標/鍵到NSObject的關聯,然後我稱之爲「objc_getAssociatedObject」,這是安全的?associatedValueForKey,無法識別的關鍵

我在模擬器上測試,它不會崩潰,但我想是肯定的。

當我撥打電話:

objc_setAssociatedObject(self, key, value, OBJC_ASSOCIATION_RETAIN); 

是否當我是NSObject的是dealloc'd我與NSObject的關聯對象得到釋放? (我正在使用ARC)。

+0

鑑於ARC的工作方式,這似乎不太可能ARC被插入'和'nil'或'objc_removeAssociatedObjects'你objc_setAssociatedObject' - 因爲它不知道在哪裏放置這些調用。但是我在文檔中找不到明確的答案。 – FluffulousChimp

回答

4

如果有一個地方沒有任何關聯,objc_getAssociatedObject將返回nil

當一個對象相關聯,它將使用在最後一個參數提供的語義。例如,OBJC_ASSOCIATION_RETAIN將保留該對象,以便只要該關聯就位,就不會釋放該對象。

當保持該關聯(的第一個參數objc_setAssociatedObject)deallocs對象,它會破壞的關聯。當關聯被破壞時,被保留的對象將被釋放(如果它被保留開始)。

所以,你的例子:

objc_setAssociatedObject(self, key, value, OBJC_ASSOCIATION_RETAIN); 

value將被保留,直到關聯被打破。當self解除分配或關聯被另一個objc_setAssociatedObject更改時,該關聯將被破壞。