Eu vi o "novo tipo" BOOL
( YES
, NO
).
Eu li que esse tipo é quase como um char.
Para testar eu fiz:
NSLog(@"Size of BOOL %d", sizeof(BOOL));
NSLog(@"Size of bool %d", sizeof(bool));
É bom ver que os dois logs exibem "1" (às vezes, no C ++ bool, é um int e seu tamanho é 4)
Então, eu só estava me perguntando se havia algum problema com o tipo bool ou algo assim?
Posso apenas usar bool (que parece funcionar) sem perder velocidade?
c
objective-c
types
boolean
Francescu
fonte
fonte
bool
. Todas as estruturas de Objective-C usamBOOL
.NSInteger progressTime = 2;//any value NSInteger totalTime = 1;//any value BOOL success = (progressTime>=totalTime)
// é sempre dáNO
Mas Depois que recebi esse(progressTime>=totalTime)
valor nobool
tipo,success
ele retorna o resultado correto. Eu não entendo esse comportamento. Estou usandoXcode 7.x
e aiOS
versão era8.x
. @BarryWarkComo mencionado acima, BOOL é um caractere assinado. tipo bool do padrão C99 (int).
BOOL - SIM / NÃO. bool - verdadeiro / falso.
Veja exemplos:
E o resultado é
Observe que bool! = BOOL. O resultado abaixo é apenas UMA VEZ DE NOVO - REAL b2
Se você deseja converter bool para BOOL, use o próximo código
Então, no nosso caso:
E então .. o que temos agora? :-)
fonte
!!b1
. Para converter entre elesNo momento da redação, esta é a versão mais recente do objc.h:
Isso significa que em dispositivos iOS de 64 bits e no WatchOS
BOOL
é exatamente a mesma coisa quebool
em todos os outros dispositivos (OS X, iOS de 32 bits), ésigned char
e nem pode ser substituído pelo sinalizador do compilador-funsigned-char
Isso também significa que esse código de exemplo será executado de maneira diferente em plataformas diferentes (eu mesmo testei):
BTW nunca atribui coisas como
array.count
aBOOL
variável porque cerca de 0,4% dos valores possíveis serão negativos.fonte
O tipo de Objective-C que você deve usar é
BOOL
. Não há nada como um tipo de dados booleano nativo, portanto, para garantir que o código seja compilado em todos os compiladoresBOOL
. (Ele é definido nos frameworks da Apple.fonte
BOOL
é definido pela linguagem Objective-C (está em um dosobjc/*.h
cabeçalhos), não pelas estruturas. Além disso, ao compilar com o C99 (que eu acho que é o padrão), existe um tipo booleano nativo_Bool
(oubool
sestdbool.h
estiver incluído).Sim, BOOL é um typedef para um caractere assinado de acordo com objc.h.
Eu não sei sobre bool, no entanto. Isso é uma coisa de C ++, certo? Se for definido como um caractere assinado, onde 1 é SIM / verdadeiro e 0 é NÃO / falso, imagino que não importa qual deles você usa.
Porém, como o BOOL faz parte do Objective-C, provavelmente faz mais sentido usar um BOOL para maior clareza (outros desenvolvedores do Objective-C podem ficar intrigados se virem um bool em uso).
fonte
Outra diferença entre bool e BOOL é que eles não são convertidos exatamente para o mesmo tipo de objetos, quando você faz observação de valores-chave ou quando usa métodos como - [NSObject valueForKey:].
Como todos disseram aqui, BOOL é char. Como tal, é convertido em um NSNumber com um caractere. Este objeto é indistinguível de um NSNumber criado a partir de um caractere regular como 'A' ou '\ 0'. Você perdeu totalmente as informações que originalmente possuía um BOOL.
No entanto, bool é convertido em um CFBoolean, que se comporta da mesma forma que NSNumber, mas que mantém a origem booleana do objeto.
Eu não acho que isso seja um argumento em um debate BOOL vs. bool, mas isso pode te morder um dia.
De um modo geral, você deve usar o BOOL, pois esse é o tipo usado em qualquer lugar nas APIs do Cocoa / iOS (projetadas antes da C99 e de seu tipo bool nativo).
fonte
A resposta aceita foi editada e sua explicação se tornou um pouco incorreta. O exemplo de código foi atualizado, mas o texto abaixo permanece o mesmo. Você não pode assumir que o BOOL é um caractere por enquanto, pois depende da arquitetura e da plataforma. Portanto, se você executar o código na plataforma de 32 bits (por exemplo, iPhone 5) e imprimir @encode (BOOL), verá "c". Corresponde a um tipo de caractere . Mas se você executar o código no iPhone 5s (64 bits), verá "B". Corresponde a um tipo de bool .
fonte
Eu vou contra a convenção aqui. Eu não gosto de typedef para tipos de base. Eu acho que é um indireto inútil que remove valor.
fonte
size_t
), e ambosbool
(C99) eBOOL
(ObjC) se enquadram nessa categoria. E se o seu código falhou devido a uma alteração no typedef, é o seu código culpado, pois você aparentemente não tratou o typedef como algo opaco, mas confiou na implementação em uma plataforma. (Nada para se envergonhar, isso acontece, mas não é o typedef a culpa.)BOOL varname
vez dissochar varname
, é mais óbvio que os dois valores válidos para essa variável sãotrue
/YES
oufalse
/NO
.Como mencionado acima,
BOOL
pode ser umunsigned char
tipo, dependendo da sua arquitetura, enquantobool
é do tipoint
. Uma experiência simples mostrará a diferença por que BOOL e bool podem se comportar de maneira diferente:Para sua surpresa
if(objcBOOL != YES)
, o 1 será avaliado pelo compilador, uma vez que,YES
na verdade , é o código de caractere 1 e, aos olhos do compilador, o código de caractere 64 não é, obviamente, igual ao código de caractere 1, portanto, a instrução if será avaliada comoYES/true/1
e a linha a seguir será corre. No entanto, como umbool
tipo nenhum zero avalia sempre o valor inteiro 1, o problema acima não afetará seu código. Abaixo estão algumas boas dicas se você deseja usar oObjective-C BOOL
tipo versus oANSI C bool
tipo:YES
ouNO
nada mais.BOOL
tipos usando o!!
operador double not para evitar resultados inesperados.YES
usoif(!myBool) instead of if(myBool != YES)
, é muito mais limpo usar o!
operador not e fornece o resultado esperado.fonte
Além disso, esteja ciente das diferenças de conversão, especialmente ao trabalhar com máscaras, devido à conversão para char assinado:
Se BOOL for um caractere assinado em vez de um bool, a conversão de 0x0100 para BOOL simplesmente reduz o bit definido e o valor resultante é 0.
fonte