2013-04-09 42 views
12

Tôi đang làm việc với lập trình socket.I chỉ muốn xóa một nghi ngờ liên quan đến mã tôi đã tải xuống từ - mobileorchard.com - Chatty. Trong khi R & D, tôi thấy một cuộc gọi chức năng trong ChatRoomViewController.m tập tinTại sao chúng ta gọi phương thức doesNotRecognizeSelector:?

[chatRoom broadcastChatMessage:input.text fromUser:[AppConfig getInstance].name]; 

khi tôi thấy trong Room.m tập tin, để thực hiện các cuộc gọi trên; đó là

- (void)broadcastChatMessage:(NSString*)message fromUser:(NSString*)name 
{ 
    // Crude way to emulate an "abstract" class 
    [self doesNotRecognizeSelector:_cmd]; 
} 

i googled cho "doesNotRecognizeSelector:", theo Apple của nó để xử lý lỗi, trong đó nêu "Hệ thống runtime gọi phương pháp này bất cứ khi nào một đối tượng nhận được một thông báo aSelector nó không thể trả lời hoặc chuyển tiếp" câu hỏi của tôi là tại sao nhà phát triển gọi hàm broadcastChatMessage: fromUser: nếu nó không sử dụng ở đó và xử lý ngoại lệ "không tìm thấy bộ chọn" của phương thức nào?

Theo Stackovrflow, được sử dụng để tạo lớp trừu tượng, theo điều này Question, để tránh cảnh báo "Triển khai chưa đầy đủ".

Tôi vẫn không hiểu tại sao phương thức đó được sử dụng trong số Chatty Code, Vui lòng giúp tôi hiểu lý do tại sao phương thức đó được sử dụng.

+1

Dường như nhà phát triển ứng dụng gốc đã cố gắng mô phỏng các tính năng của lớp cơ sở trừu tượng C++, trong trường hợp đó là không hợp lệ. Nó chỉ đơn giản là một hình thức cực đoan hơn làm cho các phương thức không làm gì hoặc trả về một giá trị giữ chỗ (thường là 0 hoặc NULL). – CodaFi

Trả lời

11

Đây là phương thức tồn tại trên mọi đối tượng dẫn xuất NSObject kích hoạt đường dẫn đến một ngoại lệ khi phương thức không được nhận dạng trong cuộc gọi thời gian chạy. Ví dụ: nếu bạn cố gắng gửi thư đến số NSString được gọi là -foo, nó sẽ kết thúc ở đó vì đó không phải là phương thức hợp lệ trên NSString.

Trong trường hợp này, lớp Chatty Room là lớp cơ sở không bao giờ được sử dụng trực tiếp. LocalRoomRemoteRoom lấy được từ nó và cả hai lớp đó cung cấp sự thực thi quan trọng là -broadcastChatMessage:fromUser. Không ai gọi là phiên bản lớp cơ sở, nhưng đối với "đầy đủ", lập trình viên đã đảm bảo rằng một lớp con phải ghi đè điều này bằng cách thực hiện phương thức, nhưng sau đó quay lại và gọi điều này để kích hoạt một ngoại lệ.

Thing là, đây không phải là mục tiêu đặc biệt thành ngữ-C. Một lớp "trừu tượng" là một khái niệm từ C++ và các ngôn ngữ khác; đó là lớp cơ sở chỉ tồn tại dưới dạng "mẫu" mà từ đó đến phân lớp. (Trong ObjC, điều này thường được thực hiện bằng cách tạo ra một chính thức @protocol khi không có trạng thái có ý nghĩa, vì có (chủ yếu) không có ở đây).

Lưu ý rằng cuộc gọi đến -doesNotRecognizeSelector: là tùy ý. Nó không cần thiết để tránh cảnh báo trình biên dịch ở đây (vì phương pháp này được thực thi) và người viết ban đầu có thể dễ dàng ném trực tiếp một ngoại lệ, hoặc không làm gì thay thế.

4

Dường như với tôi rằng bạn đã trả lời câu hỏi của riêng bạn. Không có phương pháp để tạo các lớp trừu tượng trong Objective-C, vì vậy điều gần nhất để làm nó để có các phương thức mà bạn cần để ghi đè các ngoại lệ ném. Nếu bạn ghi đè phương thức này trong một lớp con, thì doesNotRecognizeSelector: sẽ không còn được gọi. Về cơ bản nó là một cách để có được một nhà phát triển để hứa sẽ thực hiện phương pháp này trong phân lớp của họ.

Ngoài ra, như bạn đã đề cập, nếu bạn không đặt điều này vào thì trình biên dịch sẽ đưa ra cảnh báo vì không có triển khai thực hiện cho một phương thức được xác định trong tiêu đề. Điều này sẽ thực hiện các hành vi tương tự như không thực hiện nó, nhưng trình biên dịch sẽ nhận ra rằng bạn đang làm nó với mục đích.

Các vấn đề liên quan