2011-01-01 1 views
1

iPhone/iPad 개발에 대한 초보자가 여기 있습니다. 이상한 질문 인 경우 용서해주세요. 의 @implementationiPhone/iPad 이벤트 처리기를 별도의 .m 파일로 분리 한 다음 viewcontroller @implementation에서 #import하는 것이 합리적입니까?

후 별도하는 .m 파일에 콜백을 UIViewController 내에서보기에서 대부분의 객체 (또는 객체 그룹), 이벤트 콜백을 정의해야 할 필요가 그룹에 합리적인 것 같다 점을 감안하고 #import을 viewcontroller?

이 방법, 표준 방법, 난 nitWithNibName:, -viewDidLoad, shouldAutoRotateInterfaceOrientation:, didReceiveMemoryWarning:, -viewDidUnload과 (엑스 코드에 의해 제공)의 dealloc은 viewcontroller.m 파일에 정의 된 유일한 방법이 될 것입니다. viewcontroller.m 파일은 이벤트 콜백의 모 놀리 식 괴물이되지 않으며 유지 관리가 더 간단합니다. 나는 당신이 당신의 @synthesize 콘센트들 뒤에 넣었다고 생각하고 있습니다.

생각하십니까?

+0

iPhone/iPad 개발에 대해 한 달을 보냈다면, 필자가 본 대부분의 코드와 Apple 개발자 코드가 같은 viewcontroller.m 파일을 사용합니다.pragma 문을 추가하면 당분간 Darren 's가 가장 간단하고 최상의 방법 인 것처럼 보입니다. 나는 저스틴의 접근 방식을 좋아하지 만, 이럴 때 더 잘된다면, 나는 일하는 방식을 구현할 수 있습니다. 답장을 보내 주셔서 감사합니다. – KevinS

답변

0

모 놀리 식 파일을 만드는 것처럼 보일 수도 있지만 ViewController는 실제로이 모든 것들을위한 장소입니다. 만약 당신이 제안한 것을한다면 (그것은 전적으로 가능합니다), 당신은 거의하지 않는 파일들로 끝날 것입니다.

한 가지 방법이 큰 파일 구성을 계속하는 것은과 같이 프라그 마크와 방법의 별도의 그룹입니다 :

#pragma mark lifecycle methods 

-(void)dealloc{} 
-(id)init{} 
-(id)initWithCoder: 

#pragma mark target-action 

-(id)doSomethingAction:(id)sender{} 
-(id)doSometingElse:(id)sender{} 

엑스 코드는 프라 그마 마크 및 그룹에게 풀다운 항목 표시 줄에 당신을위한 방법을 분석한다 쉬운 접근을 위해. 이 목록의 메소드도 알파벳 순서로 나열됩니다.

/* File: Header A */ 
@interface MONViewController : NSViewController 
{ 
    unsigned anIvar; 
} 

@property (nonatomic, readonly) unsigned anIvar; 

- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)bundle; 
- (void)dealloc; 

- (void)viewDidLoad; 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation; 

/* (continued) */ 

@end 

/* File: Header A or Header B, depending on how you want to organize it */ 

@interface MONViewController (EventCallbacks) 

- (IBAction)triviaButtonWasPressed:(id)sender; 

/* (continued) */ 

@end 

/* File: Imp A */ 
@implementation MONViewController 

- (id)initWithNibName:(NSString *)nibName bundle:(NSBundle *)bundle { /* ... */ } 
- (void)dealloc { /* ... */ } 
- (unsigned)anIvar { /* ... */ } 

- (void)viewDidLoad { /* ... */ } 
- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation { /* ... */ } 

/* (continued) */ 

@end 

/* File: Imp A or Imp B, depending on how you want to organize it */ 

@implementation MONViewController (EventCallbacks) 

- (IBAction)triviaButtonWasPressed:(id)sender { /* ... */ } 

/* (continued) */ 

@end 

다행히, 컴파일러는 범주를 정의 할 때 클래스에서 수행되는 것처럼, 모든 선언을 정의한 있는지 확인합니다 :

+0

darren, 이것은 내가 가지고있는 생각과 ViewController.m이이 코드의 장소라는 믿음 사이의 절충안 일 수 있습니다. – KevinS

0

여기에 하나 개의 대안의 그림이이 objc 범주를 사용합니다. 프로토콜과 같은 적절한 클래스 구현에서 정의되어야하는 것이 있습니다.

작은 파일을 여러 개 만들면 조심해야하므로 빌드 시간이 많이 걸릴 수 있습니다. 또한이 경우 하위 클래 싱 이후 다소 불가피하지만 확장 성 문제는 인터페이스/클래스가 너무 많이 수행하려고 시도하고 작은 구성 요소로 분할되어야한다는 알림으로 작용해야합니다. 행운을 빕니다!

+0

저스틴, 나는이 주변을 둘러보기 위해 이걸 좀 더 가까이에서보아야 할 것입니다. 그래서 이걸 올바르게 이해하면 MONViewController에 (EventCallbacks)를 추가하여 내 UI 콜백에서 기본 콜백을 분리하고 .m 및 .h 파일을 별도로 넣을 수 있습니다. 선택하면 모든 것이 작동하므로 Imp A와 Imp B 파일 모두 @implementation MONViewController를 참조하지만 여전히 콘센트에 액세스 할 수 있습니까? 또는 @interface @property (s)를 정의했는지 알아야합니까? I * DO *가 내가 정의한 곳을 알아야 할 필요가있는 것처럼 보입니다. – KevinS

+0

예, 컴파일러는 선언 된 메서드 또는 속성을 정의하지 않은 경우 경고합니다. 그래서 ... triviaButtonWasPressed :'인터페이스/카테고리에서 선언 된 모든 것은 해당 @implementation에 정의되어야합니다. 카테고리에서 속성을 선언 할 수 있습니다. IB가 해당 헤더를 찾을 수 있다고 가정하면 (예 : 프로젝트에 있고 구문 분석 할 수 있음) 작업 및 콘센트를 사용할 수 있어야합니다. 주의 사항 : 컴파일러는 여러 인터페이스에서 동일한 메소드를 정의했는지 경고하거나 확인하지 못합니다. 두 구현 모두에서 viewDidLoad를 정의 할 수 있습니다. 이것은 아마도 UB 일 것입니다. 바보 같아 – justin

0

필자가 분리 해낸 문제점은 대부분의 콜백이 클래스 로컬 변수와 함께 작동해야하며, @implementation에 대한 해당 헤더 파일에서 선언하도록하는 것이 더 간단하다는 것입니다. 나에게보기 컨트롤러에서 이벤트 처리 항목을 유지하고 다른 기능을 일부 별도의 파일로 옮겨 놓는 것이 더 합리적입니다 ...

하지만 무엇이든 부수는 것은 동일한 클래스 인스턴스 변수를 사용해야 할 수도 있습니다 즉, 클래스 변수를 공개하지 않아도되도록 만들 수 있습니다.

Justin이 제시 한 카테고리 브레이크 아웃은이 문제를 해결하지만 기술적으로 볼 수없는 클래스 인스턴스 변수를 사용하는 것은 이상한 것처럼 보입니다.

+0

Kendall, .m 파일은 # import'd이며 별도로 컴파일되지 않으므로 viewcontroller.m 파일에있는 모든 변수에 액세스 할 수 있습니다. 그들은 .h 파일과 똑같이 행동하며, 나머지 viewcontroller.m 파일을 망가 뜨리지 않습니다. – KevinS

+0

나는 그들이 접근 할 수 있다는 것을 알고있다. 클래스 내부 변수를 사용하는 카테고리를 갖는 것은 나쁜 형태이다. 또한 해당 헤더 파일로 즉시 전환 할 수없는 경우에도 성가 시게됩니다 (프로토콜 구현 파일에있을 때 XCode 헤더 토글 명령이 "실제" 인터페이스 파일) –

+0

좋은 지적. 감사. 저스틴이 생각해 낸 제안이 앞으로 나아갈 수있는 방법 일지 모르지만 내 질문에 답하기 위해 입력 한 시간과 시간에 감사드립니다. – KevinS

관련 문제