NSMutableDictionary бросает doNotRecounceSelector в objectForKey?
-
21-08-2019 - |
Вопрос
Я полный нуб в программировании для iPhone, и я столкнулся с исключением, которое я просто не могу понять.
Фон:Ошибка возникает в пользовательском подпредставлении и возникает сразу после загрузки программы.Я получаю исключение в переопределенном методе drawRect.Код, выдающий ошибку, следующий:
- (void)drawRect:(CGRect)rect{
NSNumber *points = [NSNumber numberWithInt: star.numberOfPoints];
//HERE. Doesn't recognize selector?!
CGPathRef t = (CGPathRef)[starPaths objectForKey:points];
/*snip*/
StarPaths инициализируется в AwakeFromNib как NSMutableDictionary с емкостью 1.
Выбрасывается исключение -[NSObject DoesNotRecounceSelector:]
starPaths объявлен в заголовочном файле представления как
NSMutableDictionary *starPaths;
и инициализируется как
- (void)awakeFromNib{
starPaths = [NSMutableDictionary dictionaryWithCapacity: 1];
}
Наконец, мне не удалось добраться до момента в коде, где я успешно добавляю элементы в словарь, поскольку код для добавления записи основан на получении нулевого ответа из словаря, чтобы знать, что эта конкретная запись должна быть быть построено.
Какие-либо предложения?Любую другую информацию, которую я должен предоставить?Любая помощь будет оценена по достоинству, я чувствую, что упускаю что-то очевидное, но я весь день бился об это головой, но безуспешно.
Решение
Если вы этого не сделаете retain
тот starPaths
переменную или явно выделите ее самостоятельно с помощью [[NSMutableDictionary alloc] initWithCapacity:1]
тогда он будет автоматически освобожден на следующей итерации цикла выполнения.
Вам нужно сделать
starPaths = [[NSMutableDictionary dictionaryWithCapacity:1] retain];
Или
starPaths = [[NSMutableDictionary alloc] initWithCapacity:1];
Просто убедитесь, что release
это тогда, когда оно вам больше не нужно.
Другие советы
Несколько вещей, которые нужно проверить:
Объявлен ли starPaths как переменная экземпляра NSMutableDictionary*?Вы упоминаете, что он инициализирован.Использовали ли вы методdictionWithCapacity (который возвращает объект автоматического выпуска) или initWithCapacity (который необходимо явно сохранить).На всякий случай вы можете сохранить его и отпустить, когда закончите.
Дважды проверьте, чтобы убедиться, что файлы заголовков правильно включены и объявление starPaths включено в файлы реализации, которые его используют.
Вообще говоря, если вы получаете загадочные ошибки, это связано с повреждением памяти.Попробуйте поставить точку останова в первой строке метода drawRect и выполнить "
po starPaths
" в окне консоли отладчика, чтобы увидеть, что в нем находится и какой тип объекта считает среда выполнения.