If I declare a property strong, like so:
@property (strong, nonatomic) UIView *iVar;
When I'm setting it, does it matter if I do iVar = ...
or self.iVar = ...
? It seems that with ARC, they do the same thing.
If I only declare the instance variable (not the @property), e.g., BOOL selected
, does that mean it's inferred to be __unsafe_unretained
(since there's no property specifying it to be strong), or must I explicitly specify that?
It seems like I may have answered my own questions above in answering ARC: How to release static variable?, but I'm still slightly confused on the above questions.
From a memory management perspective, using ivar = ...
or self.property = ...
(note: there's no such thing as self.ivar
) are the same. However, using ivar = ...
doesn't invoke the setter while self.property = ...
does. This has 3 important ramifications, in no particular order:
- If the property is not marked
nonatomic
, then access to the underlying ivar will not take the lock and you will be breaking the atomicity implications.
- If the property is overridden, either by you or by a subclass, the overridden setter will not be invoked.
- KVO notifications will not be sent.
As for only declaring the ivar, it has the same memory management semantics as declaring a local variable. This is documented in section 4.4 of the Objective-C Automatic Reference Counting document, but basically, if it's an object, it will be inferred to be __strong
.