In my interface (.h) file, I have
@property(readonly) NSString *foo;
and in my implementation (.m) file, I have
@synthesize foo;
With ARC turned on, the compiler gives me this error: Automatic Reference Counting Issue: ARC forbids synthesizing a property of an Objective-C object with unspecified ownership or storage attribute.
The error goes away if I add a strong
, weak
, or copy
to the property. Why is this? Why would there be any differences between these things for a read-only property, what are those differences, and why does the programmer have to worry about them? Why can’t the compiler intelligently deduce a default setting for a read-only property?
Another question while I’m at it: strong
, weak
, or copy
are the only things that make sense in ARC, right? I shouldn’t be using retain
and assign
anymore, should I?
You've declared a @property
that doesn't have a backing ivar. Thus, when the compiler sees @synthesize
, it tries to synthesize a backing ivar for you. But you haven't specified what kind of ivar you want. Should it be __strong
? __weak
? __unsafe_unretained
? Originally, the default storage attribute for properties was assign
, which is the same as __unsafe_unretained
. Under ARC, though, that's almost always the wrong choice. So rather than synthesizing an unsafe ivar, they require you to specify what kind of ivar you want.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With