2012-02-27 5 views
3

죄송합니다 두 번째 인터페이스 선언이 ...하지만 그것은 나를 혼란? ...왜 기본 않는 스토리 보드 애플리케이션은

내가 거기 왜 자신을 물어 단지 엑스 코드와 새로운 스토리 보드 응용 프로그램을 시도하고있어 구현 파일의 @interface에 대한 두 번째 선언?

#import "ViewController.h" 

@interface ViewController() 

@end 

@implementation ViewController 

.... 

@end 

답변

10

애플의 설명서를 참조하십시오. 헤더 밖에서 비공개로 유지하려는 속성 및 메서드를 선언하고 읽기 전용으로 공개적으로 읽기 전용 속성 및 메서드를 비공개 읽기 쓰기로 다시 선언하는 데이 메서드를 사용합니다. 이렇게하면보다 깔끔한 캡슐화가 가능합니다. 요청에 의해

친근한 예 :

JYDuckPondManager.h

@interface JYDuckPondManager : NSObject 

@property (nonatomic, assign, readonly) NSUInteger duckCount; 
@property (nonatomic, assign, readonly) CGFloat waterLevel; 

- (JYDuckReaction *)feedDucks:(JYDuckFood *)food; 
- (JYDuckReaction *)harassDucks:(JYDuckTaunt *)taunt; 

@end 

JYDuckPondManager.m (내선 생략 허수 구현)

@interface JYDuckPondManager() 

//// Redefined for internal modification 
@property (nonatomic, assign, readwrite) NSUInteger duckCount; 
@property (nonatomic, assign, readwrite) CGFloat waterLevel; 

//// Internally exclusive properties 
@property (nonatomic, strong) NSSet *duckPersonalitySet; 
@property (nonatomic, assign) CGFloat flockAnxietyLevel; 

//// Private messages 
- (void)recalculatePondState; 

@end 

다른 물체와 상호 작용할 수 있어야 연못이지만, 연못에서 진행되는 어떤 일들을 알거나 연못의 통계를 재정의하기로되어 있지 않습니다. .m 확장자에 너트와 볼트를 넣으면 .h가 간결하고 적절하게 제한됩니다.

+0

이 기능이 필요한 일반적인 용도는 무엇입니까? – spankmaster79

+1

예를 들어 편집되었습니다. :) –

+2

+1 오리를 사용하는 경우 ;-) – spankmaster79

3

상기 제 2 인터페이스 @interface ViewController() 익명 카테고리 같다 클래스 확장 .H

#import <UIKit/UIKit.h> 

@interface ViewController : UIViewController { 

} 

@end 

하는 .m

. 클래스 확장은 이름이없는 카테고리처럼 선언됩니다. 이러한 확장에서 발견 된 선언은 클래스의 기본 코드 인 @interface에서 직접 확장되며 경우에 따라 (일부 상황에서)은 기본 인터페이스에서 선언을 재정의 할 수 있습니다. https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocCategories.html

는 괄호 내부에 이름이 없기 때문에 그것은, 카테고리에서 미묘하게 다른 클래스 확장,이다 :

4

.m 파일의 두 번째 @interface 블록은 확장 프로그램입니다. 클래스 내에서 내부적으로 사용할 메소드 및 인스턴스 변수에 대한 선언을 추가 할 수 있습니다.