Я нашел эту ветку чрезвычайно полезной, предоставляя все, что мне нужно для реализации моих isEqual:
и hash
методов, реализованных с помощью одной зацепки При тестировании переменных экземпляра объекта в isEqual:
код примера использует:
if (![(id)[self name] isEqual:[aWidget name]])
return NO;
Это неоднократно не удавалось ( то есть , возвращалось NO ) без ошибок и ошибок, когда я знал объекты были идентичны в моем устройстве тестирование. Причина была в том, что одна из NSString
переменных экземпляра была nil , поэтому вышеприведенное утверждение было:
if (![nil isEqual: nil])
return NO;
и поскольку ноль будет отвечать на любой метод, это совершенно законно, но
[nil isEqual: nil]
возвращает nil , что составляет NO , поэтому, когда и объект, и объект, который тестируется, имеют nil объект, они будут считаться не равными ( т.е. , isEqual:
вернет NO ).
Это простое исправление состояло в том, чтобы изменить оператор if на:
if ([self name] != [aWidget name] && ![(id)[self name] isEqual:[aWidget name]])
return NO;
Таким образом, если их адреса одинаковы, он пропускает вызов метода, независимо от того, оба они nil или оба указывают на один и тот же объект, но если один из них не nil или они указывают на разные объекты, тогда компаратор соответствующим образом называется.
Надеюсь, это сэкономит кому-то несколько минут от царапин на голове.