开发者

Control Best Practices [closed]

As it currently stands, this question is not a good fit for our Q&A format. We expect answers to be supported by facts, references, or expertise, but this question will likely solicit debate, arguments, polling, or extended discussion. If you feel that this question can be improved and possibly reopened, visit the help center for guidance. Closed 10 years ago.

Is it better to only create an instance variable for a control or an instance variable with a prope开发者_如何学编程rty in objective c/xcode?

If you are to create a property is it best to make it atomic or nonatomic (for a control).

For example, what is the best practice for doing the following:

@interface blah
{
  UILabel *label;
}

@property (nonatomic, retain) IBOutlet UILabel *label;

OR

@interface blah
{
  IBOutlet UILabel *label;
}

OR

@interface blah
{    
  UILabel *label;
}

@property (retain) IBOutlet UILabel *label;

Then when I dealloc is it best to do:

[self.label release]

or [label release]

EDIT:

So to summarize...

  1. When referencing controls in you code, you should use instance variables
  2. In dealloc, you can release the controls by [iVal release]\


I wouldn't create a property for label since it doesn't need to be accessed outside of UIViewController, hence I'd use second case. The thing regarding atomicity - logic dictates that since UI should be updated from main thread only, UILabel should be accessed only in main thread too. So it virtually doesn't matter if you declare your property nonatomic or atomic, you'd access and alter that UILabel var only from main thread.

Performance-wise, nonatomic properties are faster too since access does not need to acquire lock.


If you're using the interface builder, then declaring

IBOutlet UILabel *label;

alerts the IB that there is a label that can be linked. This allows you to modify the label you create in the IB using the pointer label. However, if the label will never need modification, then there is no need to declare it or reference it at all. Simply create it in the IB and leave it at that. In this case there is no need for getter or setter methods, and so no need to use @property or @synthesize at all.

If you're creating and configuring the label entirely programmatically, then there is no need to declare it as an IBOutlet. Just use

UILabel *label;

and then adjust the label as you like in your code. The IB need not know it exists. Then create getter and setter methods if you need them.


You want to avoid using method calls in your dealloc method. You might run into a condition where your getter accesses another one of your instance variables that may have already been released. It's safer to just release the instance variable.

[label release];

And if you do decide to release via the accessor, then use the following (as stated by fichek):

self.label = nil; 
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜