Подтвердить что ты не робот

Int или NSInteger как объект для аргумента метода. Objective-C

У меня возникли проблемы с передачей числа в качестве аргумента для метода:

- (void)meth2:(int)next_int;

И для вызова этого метода мне нужно следующее:

int next_int = 1;
[self performSelectorOnMainThread:@selector(meth2:) withObject:next_int waitUntilDone:NO];
//update next_int and call meth2 again

я получаю ошибку "указатель от целого без литой" и будет иметь то же самое с NSInteger. NSNumber не полезен, потому что он неизменен, и мне нужно постоянно менять значение. Любая идея, как я могу это сделать?

Спасибо.

4b9b3361

Ответ 1

Если вы просто пытаетесь вызвать метод, вы можете использовать стандартный синтаксис:

[self meth2:next_int];

Если вам действительно нужно использовать performSelectorOnMainThread:, вы можете обернуть число в NSNumber для вызова. Вы говорите, что не можете этого сделать, потому что вам нужно изменить номер, но вы можете просто вытащить int и изменить это:

[self performSelectorOnMainThread:@selector(meth2:) withObject:[NSNumber numberWithInt:next_int] waitUntilDone:NO];
// ... later ...
- (void)meth2:(NSNumber *)number {
  int myInt = [number intValue];
  // do stuff with myInt
}

Но, может быть, вы имеете в виду, что хотите получить значение числа в качестве результата вашего вызова до meth2. Если это то, что вы имеете в виду, тогда вы можете передать двойной указатель, чтобы вернуть новый объект:

- (void)meth2:(NSNumber **)number {
  int myInt = [*number intValue];
  // do stuff with myInt
  *number = [NSNumber numberWithInt:myInt];
}
// The caller can now operate like this:
NSNumber *number = [NSNumber numberWithInt:next_int];
[self performSelectorOnMainThread:@selector(meth2:) withObject:&number waitUntilDone:YES];
int returnInt = [*number intValue];

Конечно, это не очень потокобезопасно, поэтому, если вы делаете материал с несколькими потоками, я бы посоветовал использовать ключевое слово @synchronized для доступа к переменным с несколькими потоками или настройку свойств атома (т.е. свойства не объявлены как nonatomic).

Кроме того, meth плохо для вас! ха

Ответ 2

Оберните целое число в NSNumber перед его передачей:

int next_int = 1
NSNumber *theNumber = [NSNumber numberWithInt:next_int];
[self performSelectorOnMainThread:@selector(meth2:) withObject:theNumber waitUntilDone:NO];

Тогда ваш метод -meth2: мог выглядеть примерно так:

- (void)meth2:(NSNumber*)theNumber
{
    int next_int = [theNumber intValue];
    // do whatever
}

Ответ 3

Это немного взломать, но это работает под ARC:

int next_int = 1;
[self performSelectorOnMainThread:@selector(meth2:) 
                       withObject:(__bridge id)(void*)next_int 
                    waitUntilDone:NO];

Ключевое слово __bridge скажет компилятору игнорировать подсчет ссылок в ARC, но для этого требуется указатель, поэтому вам сначала нужно применить int к указателю void типа. Когда ваш метод получит сообщение, он будет обрабатывать этот указатель объекта, как если бы он был целым числом.

Примечание. Если вы можете изменить метод для получения NSNumber вместо целого числа, тогда это будет "правильное" исправление. К сожалению, это не всегда возможно.

Ответ 4

Вы не можете использовать next_int как withObject:, потому что это не объект.

Измените свой вызов на:

[self performSelectorOnMainThread:@selector(meth2:) 
      withObject:[NSNumber numberWithInt:next_int] waitUntilDone:NO];

EDIT: И измените meth2 на ожидание NSNumber вместо int.