Как мне реализовать Hash для NSMutableSet, хранящего объекты SQL? - PullRequest
1 голос
/ 09 июня 2009

Краткое описание моей установки:

Существует базовый класс SQLObject с целым числом rowId. он реализует isEqual, сравнивая его класс и его rowId:

return [self isKindOfClass:[otherObject class]] && self.rowId == otherObject.rowId;

Он реализует хеш путем XORing своего класса с его rowId:

return [[self class] hash] ^ self.rowId;

Все объекты хранятся в NSMutableSet, поэтому, если они снова запрашиваются из БД, используется один и тот же объект, а не создается новый. При выпуске SQLObject он проверяет, равен ли retainCount ровно 1, и, если это так, удаляет его из набора, освобождая его.

Проблема в том, что он не находит объект, когда пытается удалить его из набора. RowId никогда не изменяется, как и класс, очевидно, поэтому ни хэш, ни isEqual не меняются на протяжении всей жизни объекта. В чем дело? У кого-нибудь есть идеи, почему он не может его найти?

Если я изменю коллекцию на NSMutableArray, он найдет ее.

1 Ответ

0 голосов
/ 02 октября 2009

Я никогда не придумал хорошего решения для этого. Вместо этого я предложил немного другой подход:

Каждый подкласс объекта SQL имеет свой собственный NSDictionary. Ключ - это NSNumber объекта rowId, а значение - слабая ссылка на объект SQL. Когда объект SQL освобожден, его слабая ссылка удаляется из словаря.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...