An application that I am working on, that uses ARC
and needs to support iOS 4.3 and iOS 5, declares every outlet
as @property (strong, nonatomic) IBOutlet
in the .h
file.
e.g.
// myClass.h
@property (strong, nonatomic) IBOutlet UITextView *myTextview;
I know that with ARC
only properties which do not hold a strong
reference to an object are released.
As a result, the App relies on - (void)viewDidUnload
to set the property myTextview
to nil
.
i.e.
// myClass.m
- (void)viewDidUnload
{
[super viewDidUnload];
self.myTextview = nil;
}
I know, from Apple's Documentation, that Outlets
should generally be weak
except those from File's Owner ( i.e. A Runtime Object
that owns the contents of the iOS Storyboard scene) to Top-Level Objects
(my rule of thumb is to use anything that appears in the window with File's Owner, First Responder and View).
Anything I add to the view
will be a subview
and thus is retained
by it's direct superview
, meaning a weak
reference should be used.
I am also aware that - (void)viewDidUnload
is deprecated in iOS 6 and is not called.
1st Question : What are the issues with taking the approach of declaring every outlet as a strong
property and setting it to nil
in viewDidUnload
, apart from the fact that viewDidUnload
is deprecated in iOS 6?
My intuition tells me that it is because situations arise where you can set a pointer to nil
, before viewDidUnload
is called. So you should, to free up memory on the heap. Is there a noticable performance change if this is the case?
2nd Question : Should I go back throughout the project and change strong
to weak
? Why? Is it worth the time?
3rd Question : If I was to declare the property
in a class extension
, to 'hide' it, how does this affect my rule of thumb for deciding on when to use strong
or weak
.
I know there are many threads here that discuss this issue. But many I've found are out of date, and do not address this issue directly. Thanks.