Объект - это , который был освобожден, но как только объект перешел на счетчик 0, любые вызовы методов могут вернуть устаревшие значения.
Если вы скомпилируете и запустите 32-битную версию, вы получите сообщение об ошибке ( сообщение retainCount отправлено освобожденному объекту = 0x ... ).
Я предполагаю, что 64-битная среда выполнения (опция компиляции по умолчанию на Leopard) не собирает объекты так агрессивно, как 32-битная среда выполнения, поэтому ваш вызов retainCount не вызывает ошибку.
Чтобы проверить, действительно ли ваш объект освобожден, используйте dealloc для вашего SampClass:
- (void) dealloc
{
NSLog(@"Dealloc");
[super dealloc];
}
Позднее редактирование : Как я и подозревал, разница в поведении между 32 и 64 битами при вызове метода для освобожденного объекта связана с временем выполнения, а не с неопределенным поведением.
В 32-битном виде после освобождения класса указатель isa переключается на специальный класс, позволяющий перехватывать сообщения для освобожденных объектов. Это не происходит в 64 бит.
Соответствующий источник: objc-class.m :
#if !__OBJC2__
// only clobber isa for non-gc
anObject->isa = _objc_getFreedObjectClass ();
#endif