Вопрос

Я полный нуб в программировании для 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" в окне консоли отладчика, чтобы увидеть, что в нем находится и какой тип объекта считает среда выполнения.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top