Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Why some Outlets are made strong references even tough the documentation specifies that outlets should be weak reference

Hi I am a newbie to iOS programming. I know what a strong and weak reference is. But I get confused which type of reference to use when I have to deal with outlets. After going through the documentation which states that

Outlets should generally be weak, except for those from File’s Owner to top-level objects in a nib file (or, in iOS, a storyboard scene) which should be strong.

So what I understood after going through the above statement is that the Outlets that we create should typically be weak by default.

But while studying some tutorials I have come across the code where people have declared an outlet as strong reference. For example consider the following code :

@interface AboutViewController : UIViewController

@property (nonatomic, strong) IBOutlet UIWebView *webView;

@end

The code :

@property (nonatomic, strong) IBOutlet UIWebView *webView;

says that our AboutViewController has an UIWebView object.

But why we need a strong reference here for the UIView object?? As the document states shouldn't this be an weak reference ?

Also please explain in the documentation statement which I have quoted above what does the File’s Owner to top-level objects mean?.

I have gone through many of the similar questions on this website but none of them helped me to clear my doubt. So please help. Thanks in advance :)

like image 343
iamyogish Avatar asked Feb 18 '14 07:02

iamyogish


People also ask

Should outlets be strong or weak?

Outlets should generally be weak, except for those from File's Owner to top-level objects in a nib file (or, in iOS, a storyboard scene) which should be strong.

What's a strong reference and why do we need it?

What's a Strong Reference? Strong references increase the retain count of instances they reference (by 1). This prevents the Automatic Reference Counting (ARC) from removing the object from memory, as long as the object is in use.

Why are outlets weak iOS?

Because the outlet is declared weak, it is automatically set to nil when it's deallocated. Because the outlet is an implicitly unwrapped optional, it has no value, that is, is equal to nil , and the application would crash as a result. If this happens, chances are you're doing something you shouldn't be doing.

Should IBOutlets be weak Swift?

Although IBOutlets are often found as weak, Apple recommends a while back (2015) that references should be strong by default. Of course, this is unless the reference needs to be weak.


2 Answers

What to use for non top level GUI elements - strong or weak - depends on how you are going to use their outlets. If you have a weak reference

@property (nonatomic, weak) IBOutlet UIWebView *webView;

then after calling method

[webView removeFromSupeview];

your webView will be nil and it will be impossible to restore UIWebView just by adding

[self.view addSubview:webView];

If this is appropriate for you - it is better to use weak because you will free webView's memory when you do not need it.

On the other hand, in case of a strong reference after

[webView removeFromSupeview];

webView will still have referenceCount > 0 and webView will be deallocated only if owner will free it explicitly

self.webView = nil;

or in the owner's

- (void)dealloc

together with the owner itself.

Usually there is no difference if you have static GUI. If you want to remove (not hide) some views add be able to add them later - strong references should be used.

Top level objects should be retained strong. Like

@property(nonatomic,retain) UIView *view;

in UIViewController.

like image 178
Avt Avatar answered Jan 04 '23 13:01

Avt


It usually doesn't hurt to use a strong reference in place of a weak one in the case of outlets like this. And in some cases, you do need a strong reference.

The idea is that something has to keep a strong reference to the object at all times or it could vanish. If the object is a view that is a subview of another view, then that superview will keep a strong reference to it and so you can use a weak reference. But, if you're going to do something else with that view, such as remove it from it's superview for some reason (maybe to reuse it elsewhere, or something), then you'll want to use a strong property so that there's always something holding it strongly.

Regarding the File Owner issue, that's because the top level object (most likely a view) does not have a superview holding on to it, so you need to use a strong property so that you're holding on to it.

like image 31
Dave Wood Avatar answered Jan 04 '23 11:01

Dave Wood