0

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

@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?

4

2 回答 2

1

首先,在 Cocoa 社区中,关于是否应该在 init/dealloc 中调用访问器存在相当大的争论。在此处此处此处查看相关问题。就个人而言,我属于“不要那样做”的阵营,但同样,这是值得商榷的。

其次,使用现代运行时,您根本不需要声明 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
于 2012-06-12T09:39:05.310 回答
0

作为“正确”面向对象设计的一部分,我总是被教导不应该直接访问对象的成员变量,而应该定义方法(或属性)来读取或操作这些变量。

如果这样,Objective-C 会花费一些精力(有趣吗?)。您使用@propertyand@synthesize这样您就不必显式声明您的属性并担心内存管理。这个答案更详细地解释了这种行为。

我还建议查看Apple Developer Library 上的Declared Properties

于 2012-06-12T06:26:16.807 回答