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