lib/motion/accessors.rb in rm-extensions-0.4.5 vs lib/motion/accessors.rb in rm-extensions-0.5.0

- old
+ new

@@ -17,9 +17,29 @@ val end end end + # creates an +attr_accessor+ like behavior, but the objects are + # stored in an NSMapTable with strong keys (the attrs) and + # weak values. If the value deallocates, it becomes nil, unlike + # a traditional WeakRef. + # does not conform to KVO like attr_accessor does. + def rmext_zeroing_weak_attr_accessor(*attrs) + attrs.each do |attr| + define_method(attr) do + if @__zeroing_weak_holders + @__zeroing_weak_holders.objectForKey(attr) + end + end + define_method("#{attr}=") do |val| + @__zeroing_weak_holders ||= NSMapTable.strongToWeakObjectsMapTable + @__zeroing_weak_holders.setObject(val, forKey:attr) + val + end + end + end + end end end