What's going on in NSCFBoolean and NSNumber?
Ok, so I have an NSDictionary that holds a boolean value. It's loaded from the server and parsed by the framework, and for some reason it ends up being stored as an NSCFBoolean in the dictionary (don't ask, all I know is that the -class method returns __NSCFBoolean).
Since NSCFBoolean is a framework-private class that I cannot use directly, I make a reference to it:
id myBool = myDict[@"my_bool"];
Now comes the cool part: evaluating it. I used a breakpoint and the "po" command. These are the results:
> po myBool
0
> po [myBool class]
__NSCFBoolean
> po [myBool boolValue]
<nil>
What the..?
> po myBool == true
false
> po myBool == false
<nil>
brain melts
How is it possible that == true returns false and == false returns nil?
I have a number of years of experience in programming in Objective-C but I have never seen this weird behaviour before! I've read several articles about the differences between the different boolean types and their behaviours and quirks (This article at NSHipster is quite interesting) but I've read nothing that would explain this behaviour.
objective-c boolean
add a comment |
Ok, so I have an NSDictionary that holds a boolean value. It's loaded from the server and parsed by the framework, and for some reason it ends up being stored as an NSCFBoolean in the dictionary (don't ask, all I know is that the -class method returns __NSCFBoolean).
Since NSCFBoolean is a framework-private class that I cannot use directly, I make a reference to it:
id myBool = myDict[@"my_bool"];
Now comes the cool part: evaluating it. I used a breakpoint and the "po" command. These are the results:
> po myBool
0
> po [myBool class]
__NSCFBoolean
> po [myBool boolValue]
<nil>
What the..?
> po myBool == true
false
> po myBool == false
<nil>
brain melts
How is it possible that == true returns false and == false returns nil?
I have a number of years of experience in programming in Objective-C but I have never seen this weird behaviour before! I've read several articles about the differences between the different boolean types and their behaviours and quirks (This article at NSHipster is quite interesting) but I've read nothing that would explain this behaviour.
objective-c boolean
2
Most of the confusion is caused by the fact that the compiler treatsmyBool
asid
(void pointer) although[myBool class]
prints__NSCFBoolean
. For example this explains[myBool boolValue]
==nil
becauseid
has no methodboolValue
.
– vadian
Nov 23 '18 at 11:20
2
And> p [myBool boolValue]
returns what? Be careful withpo
, since it's object, if it' 0, often it prints nil instead of false or 0 as you expect, usep
when it's the case for check.
– Larme
Nov 23 '18 at 13:49
__NSCFBoolean
is returned from@NO
,@YES
,[NSNumber numberWithBool:NO]
and[NSNumber numberWithBool:YES]
.
– Willeke
Nov 24 '18 at 1:42
@Vadian id is not the same as void pointer, see What is the meaning of id?.[myBool boolValue]
will send selectorboolValue
tomyBool
, howmyBool
is declared doesn't matter. The superclass of__NSCFBoolean
isNSNumber
and[myBool boolValue]
==nil
because[myBool boolValue]
returnsNO
whichpo
(print object) will print as<nil>
.
– Willeke
Nov 24 '18 at 2:00
add a comment |
Ok, so I have an NSDictionary that holds a boolean value. It's loaded from the server and parsed by the framework, and for some reason it ends up being stored as an NSCFBoolean in the dictionary (don't ask, all I know is that the -class method returns __NSCFBoolean).
Since NSCFBoolean is a framework-private class that I cannot use directly, I make a reference to it:
id myBool = myDict[@"my_bool"];
Now comes the cool part: evaluating it. I used a breakpoint and the "po" command. These are the results:
> po myBool
0
> po [myBool class]
__NSCFBoolean
> po [myBool boolValue]
<nil>
What the..?
> po myBool == true
false
> po myBool == false
<nil>
brain melts
How is it possible that == true returns false and == false returns nil?
I have a number of years of experience in programming in Objective-C but I have never seen this weird behaviour before! I've read several articles about the differences between the different boolean types and their behaviours and quirks (This article at NSHipster is quite interesting) but I've read nothing that would explain this behaviour.
objective-c boolean
Ok, so I have an NSDictionary that holds a boolean value. It's loaded from the server and parsed by the framework, and for some reason it ends up being stored as an NSCFBoolean in the dictionary (don't ask, all I know is that the -class method returns __NSCFBoolean).
Since NSCFBoolean is a framework-private class that I cannot use directly, I make a reference to it:
id myBool = myDict[@"my_bool"];
Now comes the cool part: evaluating it. I used a breakpoint and the "po" command. These are the results:
> po myBool
0
> po [myBool class]
__NSCFBoolean
> po [myBool boolValue]
<nil>
What the..?
> po myBool == true
false
> po myBool == false
<nil>
brain melts
How is it possible that == true returns false and == false returns nil?
I have a number of years of experience in programming in Objective-C but I have never seen this weird behaviour before! I've read several articles about the differences between the different boolean types and their behaviours and quirks (This article at NSHipster is quite interesting) but I've read nothing that would explain this behaviour.
objective-c boolean
objective-c boolean
asked Nov 23 '18 at 10:53
MarkMark
378314
378314
2
Most of the confusion is caused by the fact that the compiler treatsmyBool
asid
(void pointer) although[myBool class]
prints__NSCFBoolean
. For example this explains[myBool boolValue]
==nil
becauseid
has no methodboolValue
.
– vadian
Nov 23 '18 at 11:20
2
And> p [myBool boolValue]
returns what? Be careful withpo
, since it's object, if it' 0, often it prints nil instead of false or 0 as you expect, usep
when it's the case for check.
– Larme
Nov 23 '18 at 13:49
__NSCFBoolean
is returned from@NO
,@YES
,[NSNumber numberWithBool:NO]
and[NSNumber numberWithBool:YES]
.
– Willeke
Nov 24 '18 at 1:42
@Vadian id is not the same as void pointer, see What is the meaning of id?.[myBool boolValue]
will send selectorboolValue
tomyBool
, howmyBool
is declared doesn't matter. The superclass of__NSCFBoolean
isNSNumber
and[myBool boolValue]
==nil
because[myBool boolValue]
returnsNO
whichpo
(print object) will print as<nil>
.
– Willeke
Nov 24 '18 at 2:00
add a comment |
2
Most of the confusion is caused by the fact that the compiler treatsmyBool
asid
(void pointer) although[myBool class]
prints__NSCFBoolean
. For example this explains[myBool boolValue]
==nil
becauseid
has no methodboolValue
.
– vadian
Nov 23 '18 at 11:20
2
And> p [myBool boolValue]
returns what? Be careful withpo
, since it's object, if it' 0, often it prints nil instead of false or 0 as you expect, usep
when it's the case for check.
– Larme
Nov 23 '18 at 13:49
__NSCFBoolean
is returned from@NO
,@YES
,[NSNumber numberWithBool:NO]
and[NSNumber numberWithBool:YES]
.
– Willeke
Nov 24 '18 at 1:42
@Vadian id is not the same as void pointer, see What is the meaning of id?.[myBool boolValue]
will send selectorboolValue
tomyBool
, howmyBool
is declared doesn't matter. The superclass of__NSCFBoolean
isNSNumber
and[myBool boolValue]
==nil
because[myBool boolValue]
returnsNO
whichpo
(print object) will print as<nil>
.
– Willeke
Nov 24 '18 at 2:00
2
2
Most of the confusion is caused by the fact that the compiler treats
myBool
as id
(void pointer) although [myBool class]
prints __NSCFBoolean
. For example this explains [myBool boolValue]
== nil
because id
has no method boolValue
.– vadian
Nov 23 '18 at 11:20
Most of the confusion is caused by the fact that the compiler treats
myBool
as id
(void pointer) although [myBool class]
prints __NSCFBoolean
. For example this explains [myBool boolValue]
== nil
because id
has no method boolValue
.– vadian
Nov 23 '18 at 11:20
2
2
And
> p [myBool boolValue]
returns what? Be careful with po
, since it's object, if it' 0, often it prints nil instead of false or 0 as you expect, use p
when it's the case for check.– Larme
Nov 23 '18 at 13:49
And
> p [myBool boolValue]
returns what? Be careful with po
, since it's object, if it' 0, often it prints nil instead of false or 0 as you expect, use p
when it's the case for check.– Larme
Nov 23 '18 at 13:49
__NSCFBoolean
is returned from @NO
, @YES
, [NSNumber numberWithBool:NO]
and [NSNumber numberWithBool:YES]
.– Willeke
Nov 24 '18 at 1:42
__NSCFBoolean
is returned from @NO
, @YES
, [NSNumber numberWithBool:NO]
and [NSNumber numberWithBool:YES]
.– Willeke
Nov 24 '18 at 1:42
@Vadian id is not the same as void pointer, see What is the meaning of id?.
[myBool boolValue]
will send selector boolValue
to myBool
, how myBool
is declared doesn't matter. The superclass of __NSCFBoolean
is NSNumber
and [myBool boolValue]
== nil
because [myBool boolValue]
returns NO
which po
(print object) will print as <nil>
.– Willeke
Nov 24 '18 at 2:00
@Vadian id is not the same as void pointer, see What is the meaning of id?.
[myBool boolValue]
will send selector boolValue
to myBool
, how myBool
is declared doesn't matter. The superclass of __NSCFBoolean
is NSNumber
and [myBool boolValue]
== nil
because [myBool boolValue]
returns NO
which po
(print object) will print as <nil>
.– Willeke
Nov 24 '18 at 2:00
add a comment |
0
active
oldest
votes
Your Answer
StackExchange.ifUsing("editor", function () {
StackExchange.using("externalEditor", function () {
StackExchange.using("snippets", function () {
StackExchange.snippets.init();
});
});
}, "code-snippets");
StackExchange.ready(function() {
var channelOptions = {
tags: "".split(" "),
id: "1"
};
initTagRenderer("".split(" "), "".split(" "), channelOptions);
StackExchange.using("externalEditor", function() {
// Have to fire editor after snippets, if snippets enabled
if (StackExchange.settings.snippets.snippetsEnabled) {
StackExchange.using("snippets", function() {
createEditor();
});
}
else {
createEditor();
}
});
function createEditor() {
StackExchange.prepareEditor({
heartbeatType: 'answer',
autoActivateHeartbeat: false,
convertImagesToLinks: true,
noModals: true,
showLowRepImageUploadWarning: true,
reputationToPostImages: 10,
bindNavPrevention: true,
postfix: "",
imageUploader: {
brandingHtml: "Powered by u003ca class="icon-imgur-white" href="https://imgur.com/"u003eu003c/au003e",
contentPolicyHtml: "User contributions licensed under u003ca href="https://creativecommons.org/licenses/by-sa/3.0/"u003ecc by-sa 3.0 with attribution requiredu003c/au003e u003ca href="https://stackoverflow.com/legal/content-policy"u003e(content policy)u003c/au003e",
allowUrls: true
},
onDemand: true,
discardSelector: ".discard-answer"
,immediatelyShowMarkdownHelp:true
});
}
});
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53445305%2fwhats-going-on-in-nscfboolean-and-nsnumber%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
0
active
oldest
votes
0
active
oldest
votes
active
oldest
votes
active
oldest
votes
Thanks for contributing an answer to Stack Overflow!
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Some of your past answers have not been well-received, and you're in danger of being blocked from answering.
Please pay close attention to the following guidance:
- Please be sure to answer the question. Provide details and share your research!
But avoid …
- Asking for help, clarification, or responding to other answers.
- Making statements based on opinion; back them up with references or personal experience.
To learn more, see our tips on writing great answers.
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
StackExchange.ready(
function () {
StackExchange.openid.initPostLogin('.new-post-login', 'https%3a%2f%2fstackoverflow.com%2fquestions%2f53445305%2fwhats-going-on-in-nscfboolean-and-nsnumber%23new-answer', 'question_page');
}
);
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Sign up or log in
StackExchange.ready(function () {
StackExchange.helpers.onClickDraftSave('#login-link');
});
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Sign up using Google
Sign up using Facebook
Sign up using Email and Password
Post as a guest
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
Required, but never shown
2
Most of the confusion is caused by the fact that the compiler treats
myBool
asid
(void pointer) although[myBool class]
prints__NSCFBoolean
. For example this explains[myBool boolValue]
==nil
becauseid
has no methodboolValue
.– vadian
Nov 23 '18 at 11:20
2
And
> p [myBool boolValue]
returns what? Be careful withpo
, since it's object, if it' 0, often it prints nil instead of false or 0 as you expect, usep
when it's the case for check.– Larme
Nov 23 '18 at 13:49
__NSCFBoolean
is returned from@NO
,@YES
,[NSNumber numberWithBool:NO]
and[NSNumber numberWithBool:YES]
.– Willeke
Nov 24 '18 at 1:42
@Vadian id is not the same as void pointer, see What is the meaning of id?.
[myBool boolValue]
will send selectorboolValue
tomyBool
, howmyBool
is declared doesn't matter. The superclass of__NSCFBoolean
isNSNumber
and[myBool boolValue]
==nil
because[myBool boolValue]
returnsNO
whichpo
(print object) will print as<nil>
.– Willeke
Nov 24 '18 at 2:00