What if we had a language keyword for ownership?
For example:
retained NSImage *myImage; mutablyCopied NSTextStorage *myTextStorage; NSLayoutManager *layoutManager; //Owned by myTextStorage NSTextContainer *textContainer; //Owned by layoutManager
Or instead of retained
, we could have a keyword for non-ownership, with retain being the default for instance variables:
NSImage *myImage; //Retained by default mutablyCopied NSTextStorage *myTextStorage; borrowed NSLayoutManager *layoutManager; //Owned by myTextStorage borrowed NSTextContainer *textContainer; //Owned by layoutManager
(Hopefully, this is already common, but using comments rather than language keywords.)
Perhaps these could be implemented using something like Python’s decorator syntax:
#define retained @ownership(retain) #define copied @ownership(copy) #define mutablyCopied @ownership(mutableCopy) //What the code looks like after macro-expansion, or without using macros at all: @ownership(copy) NSString *myTitle;
Either way, the correct retain/copy/mutableCopy/release magic would happen automatically on any assignment. The only manual work still involved would be:
- (void)dealloc { [myTimer invalidate]; myTimer = nil; //Implicitly releases myTimer myTextStorage = nil; //Implicitly releases myTS (and on death, it releases its LM, and that releases its TC) [super dealloc]; }
This would make it totally impossible to forget to retain something (forgetting to retain or copy things leads to double-releases or zombie objects), and make it much harder to retain when you should copy or vice-versa. It would also make your header much richer in documentation, and the more you can learn from the header, the easier reading the implementation will be.
May 30th, 2007 at 06:18:24
A lot of what you want is coming in 10.5 with Xcode 3 & its associated GCC. It’s even public information at this point, I think.