В чем разница между приведением к BOOL и отправкой сообщения boolValue? - PullRequest
6 голосов
/ 02 декабря 2011

В чем разница между этими двумя методами, которые, как я считаю, делают одно и то же (приведение к BOOL):

BOOL boolOne = (BOOL) [dictionary objectForKey:@"boolValue"];
BOOL boolTwo = [[dictionary objectForKey:@"boolValue"] boolValue];

Когда один из них должен использоваться поверх другого?

Ответы [ 3 ]

6 голосов
/ 02 декабря 2011

Они совершенно разные.

Сначала получает указатель объекта из словаря, затем интерпретирует указатель как BOOL.Это означает, что любой не nil указатель будет интерпретироваться как YES, а nil как NO.В конкретном примере, так как словари не могут содержать nil указатели, вы только когда-либо получите YES из этой строки кода.

Второй получает тот же объект из словаря, затем отправляет сообщение boolValue к этому объекту.Предположительно, и если объект распознает сообщение, это приведет к BOOL версии объекта.

В качестве конкретного примера, если словарь содержит NSNumber, связанный с ключом @"boolValue", NSNumber получит сообщение boolValue, и, если оно ненулевое, возврат YESв противном случае NO.

Поэтому, чтобы ответить на ваш вопрос, вы должны использовать вторую форму.Приведение указателя на BOOL редко имеет какой-либо смысл.

6 голосов
/ 02 декабря 2011

Нет, они не одинаковы.Разница в том, что 2-й является правильным, 1-й - нет.

В вашей 1-й строке вы просто приводите указатель на BOOL, что примерно эквивалентно проверке, является ли указатель нулевым или нет, и не имеет ничего общего сзначение на самом деле хранится в объекте.

3 голосов
/ 02 декабря 2011
[[dictionary objectForKey:@"boolValue"] boolValue];

не является приведением, но вызывает метод на NSNumber, который возвращает bool.Внутри может быть задействовано приведение типов, но детали реализации не являются публичными.

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