Вы упомянули NSNumber
, у него нет прямых подклассов, поэтому numberWithInt:
безопасно возвращать NSNumber*
NSString*
(и другие классы, такие как NSSet
) возвращают тип id
, потому что они могут иметь подклассы (NSMutableString
и NSMutableSet
соответственно), которые наследуют этот метод. Таким образом, эти унаследованные вызовы должны возвращать экземпляр типа подкласса, и из-за правил именования методов вы не можете перегружаться только на основе возвращаемого типа. Таким образом, им нужен общий тип для всех, а именно id
.
Обновление. Последние изменения означают, что теперь доступно ключевое слово instancetype
. Вы могли заметить, что многие ссылки на id
теперь заменены на instancetype
. Это ключевое слово указывает компилятору, что возвращаемый тип метода является тем же классом, что и получатель метода.
Например (и я подчеркиваю пример, это может быть не так в реальной структуре):
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:@[]];
person
WDUK
schedule
07.11.2012
NSMutableString
в этом случае потребуется приведение. - person Richard J. Ross III   schedule 08.11.2012