Int или NSInteger как объект для аргумента метода. Objective-C - PullRequest
13 голосов
/ 29 марта 2010

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

- (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 бесполезен, потому что он неизменен, и мне нужно постоянно менять значение. Есть идеи, как мне это сделать?

Спасибо.

Ответы [ 4 ]

23 голосов
/ 29 марта 2010

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

[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).

Кроме того, мет для тебя вреден !! ха-ха

6 голосов
/ 29 марта 2010

Оберните целое число в 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 голосов
/ 24 мая 2014

Это что-то вроде хака, но это работает под ARC:

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

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

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

2 голосов
/ 29 марта 2010

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

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

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

EDIT: И измените meth2, чтобы ожидать NSNumber вместо int.

...