Dies liegt daran, NSObject
selbst -mutableCopy
implementiert (für alle Objekte, auch solche, die nicht übereinstimmen NSCopying
oder NSMutableCopying
), indem sie in -mutableCopyWithZone:
Aufruf (so, dass die Dinge Umsetzung NSMutableCopying
bekommen nur -mutableCopyWithZone:
zu implementieren, ohne dass die Implementierung für -mutableCopy
wiederholen).
Alles, was von NSObject
erbt reagiert auf -mutableCopy
, aber wenn man es tatsächlich genannt wird, wäre es zum Absturz, weil NSNumber
nicht auf -mutableCopyWithZone:
reagiert.
Sie können sehen, mit
assert([NSObject instanceMethodForSelector:@selector(mutableCopy)] == [NSNumber instanceMethodForSelector:@selector(mutableCopy)])
Analyse BBUM die einen Überblick über diese ziemlich gut - es gibt einige feine Rand Fällen, wenn diese Kontrollen dynamisch zu tun, weil Sie Antworten können Sie gar nicht erwarten.
Danke für die Details, woher es kam! – bbum
Tolle Infos. Und wenn ich mir die Dokumente für NSObject angesehen hätte: 'Dies ist eine bequeme Methode für Klassen, die das NSMutableCopying-Protokoll übernehmen. Eine Ausnahme wird ausgelöst, wenn es keine Implementierung für mutableCopyWithZone gibt. " –
@BenFlynn Haha, ich habe mich nur halb daran erinnert. Dies ist nicht unbedingt eine leicht erkennbare Funktion in Code oder Dokumentation. –