2011-01-25 5 views
2

Objective C에는 두 가지 표준 작성 방법이있는 것 같습니다. 차이가 무엇인지, 왜 다른 것이 사용되는지 이유를 이해할 수 없습니다. 예를 들어, UIWebViewDelegate에서 :이러한 Objective C 방법 스타일의 차이점은 무엇입니까?

- (void)webViewDidFinishLoad:(UIWebView *)webView { 

} 

- (void) webView:(UIWebView *)webView didFailLoadWithError:(NSError *)error { 

} 

왜 단순히 webViewDidFailLoadWithError로 작성 두 번째 아니다, 또는 왜 첫 번째 두 번째 스타일과 일치하지 않는 이유는 무엇입니까?

또 다른 예를 들어, UITableViewDataSource에서이 시간 :

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView { 
    return 1; 
} 


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section { 
    return 0; 
} 

어떻게 numberOfSectionsInTableView는 다른 방법과 같은 형식을 따르지 않는 오지?

매우 간단한 질문인데 죄송합니다. 잠시 나마 저를 괴롭 히고 있습니다. 내 머리 속에서 분명히하고 싶습니다.

미리 도움을 주셔서 감사합니다.

답변

7

모든 것은 인수의 수로 나뉩니다. 거의 모든 대리자 메서드는 메서드의 보낸 사람을 첫 번째 인수로 전달합니다. 메소드가 더 이상의 인수를 필요로하지 않으면, 메소드 서명은 첫 번째 스타일로, 그렇지 않으면 두 번째로, 각 인수의 이름을 코코아 규칙에 따라 지정합니다.

불행히도 마지막 인수 다음에 메서드 서명에 텍스트를 추가 할 수 없습니다. 만약 그렇다면, 나는 애플이 오히려 방법을 - (void) webView:(UIWebView *)webView didFinishLoad으로 명명 할 것이라고 확신한다.

편집 :이 구문 결정의 역사에 최근 여기에 스택 오버플로에 대한 흥미로운 논의가 발생했습니다. 심지어 브래드 콕스, 목표 - C의 창조자에 울려 Why must the last part of an Objective-C method name take an argument (when there is more than one part)?

1

화면에 여러 개의 웹보기 또는 테이블보기를 동시에 가질 수 있습니다. 나열된 메소드의 콜백 중에 웹보기 또는 테이블보기의 태그 속성을보고 어떤 콜백 또는 테이블보기가 콜백을 담당하는지 결정할 수 있습니다.

1

그것은 애플의 자신의 일부이다는 위임 방법에 관한 목표 - C 코딩 지침 : http://akos.ma/gt

위임 방법 (또는 위임 방법) 특정 이벤트가 발생했을 때 (대리자를 구현하는 경우) 객체가 대리자를 호출하는 것들이다.

- (BOOL)tableView:(NSTableView *)tableView shouldSelectRow:(int)row; 
- (BOOL)application:(NSApplication *)sender openFile:(NSString *)filename; 

: 메시지를 보내는 것 객체의 클래스를 식별하여

    이 이름을 시작
  • : 그들은 오브젝트의 데이터 소스에서 호출 방법에 동일하게 적용 독특한 형태를 가지고 그래서 여러분의 질문에 답하기 위해, 여러분이 인용하는 모든 메소드는 같은 패턴을 따릅니다. 메소드의 첫 번째 (그리고 때로는 유일한) 매개 변수는 델리게이트 메소드를 호출하는 객체입니다.

1

왜 두 번째 웹 게시자가 webViewDidFailLoadWithError로 작성되지 않는 이유는 무엇입니까?

다음이 될 것 때문에 :

첫 번째 인수가 부족하기 때문에 방법은 대리자에 호출 될 때, 당신은 오류를 반환하는 웹보기 모르겠다
- (void) webViewDidFailLoadWithError:(NSError *)error { 

} 

.

... 첫 번째 스타일이 두 번째 스타일과 일치하지 않는 이유는 무엇입니까?

다음 있기 때문에, 유효한 메소드 이름이 아닌

- (void)webView:(UIWebView *)webView DidFinishLoad { 
} 

의 'DidFinishLoad'부분이다 --that 인수가 선행되지 않기 때문에 할 것이다 당신은 할 수 없습니다 만 메서드 이름에 인수를 매칭하지 않고 파트를 추가합니다 (단, 인수를 전혀받지 않는 메서드는 제외).

분명히 밝히기 바랍니다.

관련 문제