2016-03-22 8 views
2

Ich bin neu in Objective-c. Wenn ich etwas Quellcode von anderen gelesen habe, habe ich ein Problem festgestellt.Kakao - Warum gibt es ein IBOutlet und eine Eigenschaft, die den gleichen Namen haben?

fand ich, dass es

IBOutlet NSPopover *popover; 

sowie

@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 

Ich denke, sie sind verschiedene Variablen ist. Ich kann jedoch nicht herausfinden, was sie tun?

Soweit es mich betrifft, die IBOutlet ist ein Popover zu zeigen. Aber was macht die @property?

Antwort

2

Dies ist entweder sehr alter Code oder in einem sehr alten (und jetzt entmutigten) Stil geschrieben. Der IBOutlet deklariert hier eine Instanzvariable (ivar). Die @property deklariert eine Eigenschaft, die von der Instanzvariable unterstützt wird. In der modernen ObjC sollten Sie es auf diese Weise implementieren:

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 

(Derzeit ist popover Öffentlichkeit, aber man sollte ein auszusetzen IBOutlet auf diese Art. Äußere Objekte sollten nicht direkt die Ausgänge eines View-Controllers berühren.)

+0

Ich bemerkte, dass das 'IBOutlet' in' @ private' gesetzt wurde. Spielt das eine Rolle? Da ich bei ObjC ziemlich neu bin, kann ich kaum herausfinden, was "Deklarieren einer Eigenschaft, die von der Instanzvariable unterstützt wird" in Ihrer Antwort bedeutet. Könnten Sie bitte einen Hinweis geben? Vielen Dank! :) –

+0

Als ein neuer ObjC Entwickler würde ich mir keine Sorgen machen. Das Deklarieren von Instanzvariablen auf diese Weise ist nicht länger notwendig oder angemessen. Siehe https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html für die aktuelle Praxis und die Zusammenarbeit von Eigenschaften und Ivars. –

Verwandte Themen