Назначение делает указатель из целого числа без приведения - PullRequest
3 голосов
/ 19 декабря 2008

У меня есть метод Obj-C, похожий на этот:

-(void)getUserDefaults:(BOOL *)refreshDefaults
{
    PostAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];

    if (refreshDefaults) {
        [appDelegate retrieveDefaults];
    }
}

Когда я это так называю, я не получаю предупреждения:

[self getUserDefaults:NO];

Когда я это так называю, я получаю предупреждение:

[self getUserDefaults:YES];

предупреждение: передача аргумента 1 в getUserDefaults: делает указатель из целого числа без приведения

ПРИМЕЧАНИЕ: я всегда вызываю метод, сначала передавая NO, а потом, спустя некоторое время, передаю YES

Может кто-нибудь сообщить мне, в чем здесь проблема? Спасибо.

Ответы [ 5 ]

17 голосов
/ 19 декабря 2008

BOOL - это примитивный тип, а не класс, поэтому объявление вашего метода должно быть

-(void)getUserDefaults:(BOOL)refreshDefaults;

вместо этого. Причина, по которой вы получаете предупреждение, заключается в том, что 0 (что определено как NO) является допустимым значением указателя без преобразования, эквивалентным NULL, но 1 (что YES определено как) не является допустимым значением указателя без приведения.

15 голосов
/ 19 декабря 2008

getUserDefaults занимает BOOL *. Вы не получаете предупреждение, когда передаете NO, потому что NO равно 0, а 0 равно NULL, что является допустимой BOOL *. ДА 1, и то же преобразование не является автоматически безопасным.

Вы должны заставить getUserDefaults брать простую BOOL вместо указателя.

5 голосов
/ 19 декабря 2008

Я никогда раньше не видел код Obj-C, но я уверен, что это потому, что «refreshDefaults» - это указатель на BOOL, тогда как это должен быть BOOL.

Я не знаю о правилах набора в Obj-C, но похоже, что NO определен как 0, и у компилятора нет проблем с преобразованием этого значения в указатель (указатель NULL). Это было бы не так с целым числом «1». (Также обратите внимание, что «if (refreshDefaults)» является допустимым кодом, который проверяет указатель refreshDefaults на NULL-указатель)

3 голосов
/ 19 декабря 2008

Круто, спасибо! Это имеет смысл, и это исправлено! Вот обновленный код для справки:

-(void)getUserDefaults:(BOOL)refreshDefaults
{
PostAppDelegate *appDelegate = [[UIApplication sharedApplication] delegate];

if (refreshDefaults) {
    [appDelegate retrieveDefaults];
}
}
1 голос
/ 19 декабря 2008

В первом случае, NO по умолчанию равен 0 - нулевой указатель. Это действительный бул *. Значение по умолчанию - 1, и поэтому, когда оно приводится к типу Bool *, вы передаете целое число 1, которое затем превращается в Bool *.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...