Bạn đề cập đến NSNumber
, điều này không có bất kỳ lớp con trực tiếp, vì vậy nó an toàn cho numberWithInt:
để trả về một NSNumber*
NSString*
(và các lớp khác như NSSet
) return loại id
vì họ có thể có các lớp con (NSMutableString
và NSMutableSet
tương ứng), sẽ kế thừa phương pháp này. Như vậy, các cuộc gọi kế thừa này cần trả về một thể hiện của kiểu của lớp con, và do các quy tắc đặt tên phương thức, bạn không thể quá tải dựa trên kiểu trả về một mình. Vì vậy, họ cần một loại chung giữa tất cả, là id
.
Cập nhật: Phát triển gần đây có nghĩa là từ khóa instancetype
hiện khả dụng. Bạn có thể đã nhận thấy nhiều tham chiếu đến id
hiện được thay thế bằng instancetype
. Từ khóa này cung cấp gợi ý cho trình biên dịch rằng kiểu trả về của phương thức là cùng một lớp của người nhận phương thức.
Ví dụ (và tôi nhấn mạnh một ví dụ, đây có thể không phải là trường hợp trong khuôn khổ thực tế):
NSArray:
- (instancetype)initWithArray:(NSArray*)array;
NSMutableArray:
// Inherits from NSArray
----
// Receiver is NSArray, method belongs in NSArray, returns an NSArray
[[NSArray alloc] initWithArray:@[]];
// Receiver is NSMutableArray, method belongs in NSArray, returns an NSMutableArray
[[NSMutableArray alloc] initWithArray:@[]];
Đối với subclassing. 'NSMutableString' sẽ yêu cầu một diễn viên trong trường hợp đó. –
Vâng, tôi đồng ý - bạn có thể thực hiện một điệu nhảy tap xung quanh lý do tại sao nó là cách nó, nhưng cuối cùng nó không có ý nghĩa. –