gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-03 17:57:38 25 4
gpt4 key购买 nike

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

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

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com