2

я пытаюсь создать NSInvocationOperation так, что он должен вызвать метод объекта с ParamsNSInvocationOperation определяют селектор с Params

- (void) getImages: (NSRange) bounds 
{ 
    NSOperationQueue *queue = [NSOperationQueue new]; 
    NSArray * params = [NSArray arrayWithObjects: 
      [[NSNumber alloc] initWithInt: bounds.location], 
      [[NSNumber alloc] initWithInt: bounds.length]]; 
    NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self 
        selector:@selector(loadImagesWithOperation) 
        object:params]; 

    [queue addOperation:operation]; 
    [operation release]; 

} 

- (void) loadImagesWithOperation:(NSArray*)bounds { 
NSLog(@"loadImagesWithOperation"); 
} 

Этот код падает с EXC_BAD_ACCESS. Если я изменю определение функции, вызываемой на это

- (void) loadImagesWithOperation { 
NSLog(@"loadImagesWithOperation"); 
} 

все становится хорошо. Я пытался использовать другой синтаксис в @selector «s кодового блока, как @selector (loadImagesWithOperation :) и @selector (loadImagesWithOperation: ограничивающей :), но не удалось.

Каков правильный способ определения селектора и функции с параметрами?

Спасибо.

+0

Опубликовать обратную траверсу аварии. – bbum

ответ

4

Правильный способ определить SEL, который принимает аргументы, чтобы использовать двоеточие (":") символ для каждого аргумента, так что в вашем случае, селектор будет выглядеть следующим образом:

@selector(loadImagesWithOperation:) 

Итак, ваш NSInvocationOperation объект должен быть инициализирован следующим образом:

NSInvocationOperation *operation = [[NSInvocationOperation alloc] initWithTarget:self 
       selector:@selector(loadImagesWithOperation:) 
       object:params]; 

о, и так же, как примечание стороны, у вас есть утечки памяти на инициализации вашего NSArray в getImages::

NSArray * params = [NSArray arrayWithObjects: 
     [[NSNumber alloc] initWithInt: bounds.location], 
     [[NSNumber alloc] initWithInt: bounds.length]]; 

Это добавляет объекты, которые уже имеют retainCount из 1, потому что вы используете +alloc, поэтому, когда они добавляются к NSArray, они посылают на -retain сообщение, тем самым приращения retainCount к 2.

NSArray Когда это будет освобождаться, эти объекты не будут высвобождены, потому что их retainCount будет 1, не 0.

Есть три варианта решения этой проблемы:

  1. Отправьте autorelease сообщение для каждого из этих объектов, прежде чем они будут добавлены в NSArray.
  2. Использовать метод NSNumbernumberWithInt: для получения автореализованного объекта NSNumber.
  3. Создайте ссылки на эти объекты NSNumber, добавьте их в NSArray, затем добавьте их, отправьте сообщение -release.
+0

Спасибо за быстрый ответ, Джейкоб, но при некоторых обстоятельствах этот код не работает. Размещение двоеточия после функции n ame в селекторе все еще вызывает EXC_BAD_ACCESS. Я застрял. – duganets

+0

Ewww ... 'keepCount'. Исправьте, что это утечка, но абсолютное количество удержаний может отличаться и не стоит упоминать. – bbum

+0

Спасибо всем за подсказку. Это были проблемы с памятью, которые вызвали крах и отсутствие какого-либо опыта в правилах управления памятью. Я работаю над этим. – duganets

3

все становится хорошо. Я попытался использовать другой синтаксис в блоке кода @ селектора как @selector (loadImagesWithOperation :) и @selector (loadImagesWithOperation: рамки :), , но не удалось.

initWithTarget:selector:object: принимает селектор, который может принимать ровно 0 или 1 аргумент, не более (не два). Этот один аргумент должен быть объектом. Если вам нужно больше аргументов, используйте блоки или рефакторируйте свой код (передача массива с остальными объектами внутри является потенциальным решением, да - вроде как то, что вы делаете в этом коде (хотя обратите внимание на утечку памяти).

катастрофа не имеет никакого отношения к коду вы показали. Выкладываю аварии.

Следует также отметить, что методы с get на голове имеют очень специфическое значение в какао/прошивкой и не используются для такого рода шаблон. Я бы предложил loadImages.

 Смежные вопросы

  • Нет связанных вопросов^_^