2016-03-22 17 views
2

私はobjective-cに新しいです。他の人が書いたソースコードを読んでいるときに問題が発生しました。ココア - 同じ名前のIBOutletとプロパティがあるのはなぜですか?

私は、彼らが異なる変数だと思います

#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 

PopoverViewController.h

IBOutlet NSPopover *popover; 

など

@property NSPopover *popover; 

があることがわかりました。しかし、私は彼らが何をしているのか理解できません。

私が関与する限り、IBOutletはポップオーバーを表示することです。 しかし、@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そのようにして、外側のオブジェクトはView Controllerのアウトレットに直接触れないようにしてください)

+0

私は 'IBOutlet'が' @ private'に置かれていることに気付きました。それは重要ですか?私はObjCの新機能として、インスタンス変数によって裏付けされたプロパティを宣言することはあなたの答えに何を意味するのかをほとんど知ることができません。ヒントを教えてください。ありがとう! :) –

+0

新しいObjC開発者として、私はそれについて心配しません。このようにインスタンス変数を宣言することは、もはや必要でも適切でもありません。現行の実践と、プロパティとivarsがどのように連携するかについては、https://developer.apple.com/library/ios/documentation/Cocoa/Conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.htmlを参照してください。 –

関連する問題