我是 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
我认为它们是不同的变量。但是,我不明白他们是做什么的?
就我而言,IBOutlet
用于显示弹出窗口。
但是 @property
的作用是什么?
最佳答案
这要么是非常古老的代码,要么是用非常古老(现在不鼓励)的风格编写的。这里的IBOutlet
声明了一个实例变量(ivar)。 @property
声明一个由实例变量支持的属性。在现代 ObjC 中,你应该这样实现它:
PopoverViewController.h
#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
PopoverViewController.m
// Generally avoid importing local headers into the .h unless you have to.
#import "TimerPopoverViewController.h"
// Things declared here are private. This is much better than the old @private.
@interface TimerPopoverDelegate ()
@property (nonatomic, readwrite, weak) IBOutlet NSPopover *popover;
@property (nonatomic, readwrite, weak) IBOutlet NSWindow *detachWindow;
@property (nonatomic, readwrite, weak) IBOutlet TimerPopoverViewController *viewController;
@end
(当前 popover
是公共(public)的,但您应该避免以这种方式公开 IBOutlet
。外部对象不应直接接触 View Controller 的导出。)
关于objective-c - cocoa-为什么有一个 IBOutlet 和一个同名的属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36157287/