objective-c - 最佳实践访问器 : @property @synthetise

标签 objective-c cocoa properties accessor

我在我的应用程序中使用以下代码:

@interface OMNController : NSObject
{
  IBOutlet NSSearchField *filterFieldMonitor;
  OMNMonitorTableView *monitorTableView;
}


@implementation OMNController
- (id) init
{
  monitorTableView = [[OMNMonitorTableView alloc] init];
  NSString *l_filter = [filterFieldMonitor stringValue];
  [monitorTableView setFilter:l_filter];
}
  ....
@end

在此代码 1 示例中,无需使用 @property @synthesize 并且可以正常工作。

为了获得最佳实践,我是否必须使用 accessor/ivar :

@interface OMNController : NSObject
{
  IBOutlet NSSearchField *_filterFieldMonitor;
  OMNMonitorTableView *_monitorTableView;
}
@property (readwrite, retain) OMNMonitorTableView *monitorTableView;
@property (assign) IBOutlet NSSearchField *filterFieldMonitor;;


@implementation OMNController

@synthesize monitorTableView = _monitorTableView;
@synthesize filterFieldMonitor = _filterFieldMonitor;

- (id) init
{
  self.monitorTableView = [[OMNMonitorTableView alloc] init];
  NSString *l_filter = [self.filterFieldMonitor stringValue];
  [self.monitorTableView setFilter:l_filter];
}
  ....
@end

-

@interface OMNController : NSObject
{
  IBOutlet NSSearchField *filterFieldMonitor;
  OMNMonitorTableView *monitorTableView;
}
@property (readwrite, retain) OMNMonitorTableView *monitorTableView;
@property (assign) IBOutlet NSSearchField *filterFieldMonitor;;


@implementation OMNController

@synthesize monitorTableView;
@synthesize filterFieldMonitor;

- (id) init
{
  monitorTableView = [[OMNMonitorTableView alloc] init];
  NSString *l_filter = [filterFieldMonitor stringValue];
  [monitorTableView setFilter:l_filter];
}
  ....
@end

最好的方法是什么,代码 1、代码 2 还是代码 3?

最佳答案

首先,Cocoa 社区对于是否应该在 init/dealloc 中调用访问器存在相当多的争论。查看相关问题here , here ,和here 。就我个人而言,我属于“不要这样做”阵营,但同样,这是有争议的。

其次,使用现代运行时,您根本不需要声明 ivars。只需声明您的属性,然后就可以完成它。 ivars 是自动合成的。

第三,对于仅在内部使用的属性(不在定义它们的类之外),实际上根本没有理由将它们放在头文件中。您可以在实现中将它们声明为类扩展。

最后,对于可能只创建一次的对象,我开始在访问器中延迟创建它们,而不是在 init 中显式创建它们。

考虑到这一切,我可能会这样写:

// OMNController.h
@interface OMNController : NSObject
@end

// OMNController.m
@interface OMNController ()
@property (nonatomic, retain) OMNMonitorTableView *monitorTableView;
@property (nonatomic, retain) IBOutlet NSSearchField *filterFieldMonitor;
@end

@implementation OMNController

@synthesize monitorTableView = _monitorTableView;
@synthesize filterFieldMonitor = _filterFieldMonitor;

- (OMNMonitorTableView*) monitorTableView 
{
    if( !_monitorTableView ) {
        _monitorTableView = [[OMNMonitorTableView alloc] init];
        NSString *l_filter = [self.filterFieldMonitor stringValue];
        [_monitorTableView setFilter:l_filter];
    }
    return _monitorTableView;
}

@end

关于objective-c - 最佳实践访问器 : @property @synthetise,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10991178/

相关文章:

objective-c - Cocoa:如何以模式方式显示窗口?

powershell - Powershell和索引器属性

variables - Gradle 任务中额外属性和变量之间的区别?

ios - 在 ios 8.3 及更高版本中,UIAlertView 导致 keyboardWillShow 和 keyboardWillHide 被调用两次

objective-c - 更新 CoreFoundation PriorityQueue 实现以利用 ARC for iOS

cocoa - 如何获取 NSView isHidden 更改的通知?

delphi - 如何反序列化没有内置转换器的属性?

ios - 在不删除 UIView 的情况下取消 UIAnimation

ios - 如何用坐标检测手指从上到下/从下到上

cocoa - 如何通过 cocoa- 绑定(bind)从数组 Controller 设置 NSBox 的标题