Objective c cocoa为什么IBOutlet和属性具有相同的名称?

Objective c cocoa为什么IBOutlet和属性具有相同的名称?,objective-c,macos,cocoa,Objective C,Macos,Cocoa,我不熟悉objective-c。当我阅读别人写的源代码时,我遇到了一个问题 我发现有 IBOutlet NSPopover *popover; 以及 @property NSPopover *popover; PopoverViewController.h #import <Foundation/Foundation.h> #import <Cocoa/Cocoa.h> #import "TimerPopoverViewController.h" @clas

我不熟悉objective-c。当我阅读别人写的源代码时,我遇到了一个问题

我发现有

    IBOutlet NSPopover *popover;
以及

@property NSPopover *popover;
PopoverViewController.h

#import <Foundation/Foundation.h>
#import <Cocoa/Cocoa.h>
#import "TimerPopoverViewController.h"

@class TimerLogic;
@class TimerInfo;

@interface TimerPopoverDelegate : NSObject <NSPopoverDelegate> {
@private
    IBOutlet NSPopover *popover;
    IBOutlet NSWindow *detachWindow;
    IBOutlet TimerPopoverViewController *viewController;
}

@property NSPopover *popover;

- (void)showPopover:(id)sender timerInfo:(TimerInfo *)timerInfo;

@end
#import <Cocoa/Cocoa.h>

@class TimerInfo;

// Things declared here are public
@interface TimerPopoverDelegate : NSObject <NSPopoverDelegate>

// You could leave this here if it is required by other parts of the program,
// but other parts of the program really shouldn't require it. See below.
// @property (nonatomic, readonly, weak) NSPopover *popover;

- (void)showPopover:(id)sender timerInfo:(TimerInfo *)timerInfo;

@end
#导入
#进口
#导入“TimerPoOverViewController.h”
@类时间逻辑;
@类TimerInfo;
@接口TimerPopVerdelegate:NSObject{
@私人的
IB插座NSPopover*popover;
IBN出口窗口*可拆卸窗口;
IBOutlet TimerPopoverViewController*viewController;
}
@财产NSPopover*popover;
-(void)showPopover:(id)发送方timerInfo:(timerInfo*)timerInfo;
@结束
我认为它们是不同的变量。然而,我不知道他们做什么

就我而言,
IBOutlet
将显示一个popover。
但是
@property
做什么呢?

这要么是非常旧的代码,要么是以非常旧(现在不鼓励)的风格编写的。这里的
IBOutlet
声明了一个实例变量(ivar)。
@property
正在声明实例变量支持的属性。在现代ObjC中,您应该以以下方式实现它:

PopoverViewController.h

#import <Foundation/Foundation.h>
#import <Cocoa/Cocoa.h>
#import "TimerPopoverViewController.h"

@class TimerLogic;
@class TimerInfo;

@interface TimerPopoverDelegate : NSObject <NSPopoverDelegate> {
@private
    IBOutlet NSPopover *popover;
    IBOutlet NSWindow *detachWindow;
    IBOutlet TimerPopoverViewController *viewController;
}

@property NSPopover *popover;

- (void)showPopover:(id)sender timerInfo:(TimerInfo *)timerInfo;

@end
#import <Cocoa/Cocoa.h>

@class TimerInfo;

// Things declared here are public
@interface TimerPopoverDelegate : NSObject <NSPopoverDelegate>

// You could leave this here if it is required by other parts of the program,
// but other parts of the program really shouldn't require it. See below.
// @property (nonatomic, readonly, weak) NSPopover *popover;

- (void)showPopover:(id)sender timerInfo:(TimerInfo *)timerInfo;

@end

(目前,
popover
是公共的,但是你应该避免以这种方式暴露
IBOutlet
。外部对象不应该直接接触视图控制器的插座。)

我注意到
IBOutlet
被放在
@private
中。那有关系吗?由于我对ObjC非常陌生,我很难理解
在您的回答中声明一个由实例变量支持的属性意味着什么。你能给我一些提示吗?谢谢!:)作为一名新的ObjC开发人员,我不会为此担心。以这种方式声明实例变量不再必要或合适。有关当前做法以及属性和IVAR如何协同工作的信息,请参见。