Как назначить значение указателю BOOL в Objective-C?
У меня есть путаница в том, как назначить значение указателю BOOL? Здесь мой код:
- (void)locationManager:(CLLocationManager *)manager didUpdateToLocation:(CLLocation *)newLocation fromLocation:(CLLocation *)oldLocation {
self.latitude.text = [NSString stringWithFormat:@"%f", newLocation.coordinate.latitude];
self.longitude.text = [NSString stringWithFormat:@"%f", newLocation.coordinate.longitude];
if (!initialBroadcast) {
initialBroadcast = YES; // Where I'm having troubles
[broadcastTimer fire];
};
}
Компилятор продолжает говорить мне следующее: Incompatible integer to pointer conversion assigning to 'BOOL *' (aka 'signed char *') from 'BOOL' (aka 'signed char')
.
Буду признателен за это, так как я nubski.
UPDATE
Как многие из вас указали, я, по-видимому, злоупотребляю объявлением BOOL
, используя указатель для него. Честно говоря, я не знаю, почему я использовал его, но так как я новичок в Objective-C, он, должно быть, работал на то, что я делал, чтобы оно застряло.
В любом случае, с тех пор я сменил объявление на:
// In .h
@interface ... {
BOOL initialBroadcast;
}
@property BOOL initialBroadcast;
// In .m
@synthesize initialBroadcast;
Итак, теперь я на правильном пути?
Ответы
Ответ 1
Вам нужно сказать
*initialBroadcast = YES;
initialBroadcast - это указатель aka адрес памяти. * Дает доступ к значению по адресу памяти, который удерживает указатель. Итак, initialBroadcast - это адрес памяти, но * initialBroadcast является логическим или char.
Ответ 2
Проблема не в назначении, гораздо более вероятно, что вы указали свою переменную экземпляра BOOL *initialBroadcast;
.
Нет причин объявлять переменную экземпляра как указатель (по крайней мере, если вам действительно не нужен массив C BOOL). Удалите * из декларации.
Кроме того, это исправит ваш текущий неверный тест if(). Как бы то ни было, он проверяет, установлен ли указатель, а не значение.
Ответ 3
Изменить -
initialBroadcast = YES;
к
(*initialBroadcast) = YES;
Так как вы присваиваете значение местоположению, на которое указывает указатель (при условии, что он инициализирован), initialBroadCast
должен быть разыменован первым.
Ответ 4
Может быть, вы должны написать
*initialBroadcast = YES; // Where I'm having troubles
Строка перед кажущейся стандартной проверкой, чтобы увидеть, что указатель действителен (не ноль)