@property defaulting to strong is poorly documented
Originator: | doug | ||
Number: | rdar://11071507 | Date Originated: | |
Status: | Marked As Duplicate | Resolved: | |
Product: | Product Version: | ||
Classification: | Serious Bug | Reproducible: | N/A |
18-Mar-2012 10:09 PM Doug Russell: Summary: As of Xcode 4.3 @property defaults to strong for objects. This is made clear by: the arc migration tool direct testing other developer experience - https://devforums.apple.com/message/620858 LLVM commit messages - http://llvm.org/viewvc/llvm-project/cfe/trunk/lib/ARCMigrate/TransProperties.cpp?revision=142304&view=markup I would expect that this would be documented in: the ARC docs - http://clang.llvm.org/docs/AutomaticReferenceCounting.html#ownership.spelling.property or the docs for properties - https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html#//apple_ref/doc/uid/TP30001163-CH17 but it is not. Steps to Reproduce: Use ARC and don't declare any ownership qualifier on an object type property Expected Results: Warning about lack of ownership qualifier or default to assign (the old default) Actual Results: Strong property Regression: Xcode 4.2.x did not default to strong for object properties when using ARC Notes:
Comments
Please note: Reports posted here will not necessarily be seen by Apple. All problems should be submitted at bugreport.apple.com before they are posted here. Please only post information for Radars that you have filed yourself, and please do not include Apple confidential information in your posts. Thank you!
Also in Clang ARC Reference
The link now leads to a section that includes:
A property of retainable object pointer type which is synthesized without a source of ownership has the ownership of its associated instance variable, if it already exists; otherwise, [beginning Apple 3.1, LLVM 3.1] its ownership is implicitly strong. Prior to this revision, it was ill-formed to synthesize such a property.
Rationale Using strong by default is safe and consistent with the generic ARC rule about inferring ownership. It is, unfortunately, inconsistent with the non-ARC rule which states that such properties are implicitly assign. However, that rule is clearly untenable in ARC, since it leads to default-unsafe code. The main merit to banning the properties is to avoid confusion with non-ARC practice, which did not ultimately strike us as sufficient to justify requiring extra syntax and (more importantly) forcing novices to understand ownership rules just to declare a property when the default is so reasonable. Changing the rule away from non-ARC practice was acceptable because we had conservatively banned the synthesis in order to give ourselves exactly this leeway.
I knew I'd read this in some Apple doc
It's documented in the Transitioning to ARC Release Notes. There's a section on properties that concludes with, “Under ARC, strong is the default for object types.” Not exactly the first place you'd look, eh?