2016-03-22 3 views
2

Я новичок в объективе-c. Когда я читаю какой-то исходный код, написанный другими, я столкнулся с проблемой.cocoa-Почему существует IBOutlet и одноименное свойство?

я обнаружил, что есть

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 должен показать popover. Но что делает @property?

ответ

2

Это либо очень старый код, либо написан в очень старом (и теперь обескураженном) стиле. Здесь 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 является открытым, но вы должны избегать подвергая IBOutlet. Внешние объекты не должны напрямую касаться точек контроллера контроллера.)

+0

Я заметил, что 'IBOutlet' помещен в' @ private'. Это имеет значение? Поскольку я совершенно новичок в ObjC, я не могу понять, что означает «объявление свойства, которое поддерживается переменной экземпляра» в вашем ответе. Не могли бы вы дать какой-то намек? Благодаря! :) –

+0

Как новый разработчик ObjC, я бы не стал беспокоиться об этом. Объявление переменных экземпляра таким образом больше не является необходимым или подходящим. См. Https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html для текущей практики и того, как работают свойства и ivars. –

Смежные вопросы