Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Does an IBOutlet needs to be a property & synthesized?

In most examples I see the following setup of IBOutlets:

  (Example A)  FooController.h:  @interface FooController : UIViewController {     UILabel *fooLabel; }  @property (nonatomic, retain) IBOutlet UILabel *fooLabel;  @end  FooController.m:  @implementation FooController  @synthesize fooLabel;  @end  

But this works also fine (notice: no property and no synthesize):

  (Example B)  FooController.h:  @interface FooController : UIViewController {     IBOutlet UILabel *fooLabel; }  @end  FooController.m:  @implementation FooController  @end  

Are there any downsides of defining IBOutlets as in Example B? Like memory leaks? Seems to work fine and I prefer to not expose the IBOutlets as public properties as they are not used as such, they are only used in the controller implementation. Defining it in three places without a real need does not strike me as very DRY (Don't Repeat Yourself).

like image 778
Ward Bekker Avatar asked Aug 03 '09 10:08

Ward Bekker


People also ask

Should IBOutlet be private?

IBOutlets should be private to avoid leaking UIKit to higher layers.

How do you declare an IBOutlet property?

If you have a property defined that you want to make accessible to your storyboards, just add the @IBOutlet attribute before your property. Similarly with @IBAction to connect storyboard actions back to code. class MyViewController: UIViewController { @IBOutlet weak var likeButton: UIButton?


1 Answers

On Mac OS X, IBOutlets are connected like this:

  1. Look for a method called set<OutletName>:. If it exists call it.
  2. If no method exists, look for an instance variable named <OutletName>, set it without retaining.

On iPhone OS, IBOutlets are connected like this:

  1. call [object setValue:outletValue forKey:@"<OutletName>"]

The behavior of set value for key is to do something like this:

  1. Look for a method called set<OutletName>:. If it exists call it.
  2. If no method exists, look for an instance variable named <OutletName>, set it and retain it.

If you use a property, you'll fall into the "Look for a method called set<OutletName>:..." case on both platforms. If you just use an instance variable, then you'll have different retain/release behavior on Mac OS X VS iPhone OS. There's nothing wrong with using an instance variable, you just need to deal with this difference in behavior as you switch between platforms.

Here's a link to full documentation on just this topic. https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/LoadingResources/CocoaNibs/CocoaNibs.html#//apple_ref/doc/uid/10000051i-CH4-SW6

like image 116
Jon Hess Avatar answered Oct 04 '22 01:10

Jon Hess