29

In Objective-c what is the difference between @YES/@NO and YES/NO? What types are used for each?

jscs
  • 63,694
  • 13
  • 151
  • 195
cdub
  • 24,555
  • 57
  • 174
  • 303

3 Answers3

46

@YES is a short form of [NSNumber numberWithBool:YES]

&

@NO is a short form of [NSNumber numberWithBool:NO]

and if we write

if(@NO)
   some statement;

the above if statement will execute since the above statement will be

if([NSNumber numberWithBool:NO] != nil)

and it's not equal to nil so it will be true and thus will pass.

Whereas YES and NO are simply BOOL's and they are defined as-

#define YES             (BOOL)1

#define NO              (BOOL)0

YES & NO is same as true & false, 1 & 0 respectively and you can use 1 & 0 instead of YES & NO, but as far as readability is concerned YES & NO will(should) be definitely preferred.

Sanjay Mohnani
  • 5,947
  • 30
  • 46
  • I got your point, but I tried `BOOL status = @YES;` which worked for me without any warning or error. – Exploring Jun 03 '15 at 09:22
  • @Exploring, `BOOL a = 1.0;, BOOL aa = self; BOOL aaa = @"abc";` all these statements will also work, without any complains from the compiler – Sanjay Mohnani Jun 03 '15 at 09:33
  • 4
    They will, because an assignment to a BOOL by definition of the language checks whether the assigned item is non-zero or non-nil and assigns YES or NO. – gnasher729 Jun 03 '15 at 10:11
19

The difference is that by using @ you are creating an NSNumber instance, thus an object. Yes and No are simply primitive Boolean values not objects.

The @ is a literal a sort of shortcut to create an object you have it also in strings @"something", dictionaries @{"key": object}, arrays: @[object,...] and numbers: @0,@1...@345 or expressions @(3*2).

Is important to understand that when you have an object such as NSNumber you can't do basic math operations (in obj-c) such as add or multiply, first you need to go back to the primitive value using methods like: -integerValue, -boolValue, -floatValue etc.

You probably seen it because foundation collection types works only with objects, so if you need to put a series of bools inside an NSArray, you must convert it into object.

Andrea
  • 26,120
  • 10
  • 85
  • 131
4
  1. @YES/@NO is type of NSNumber,is used when do something with Foundation object.For example

    NSMutableArray * array = [[NSMutableArray alloc] init];
    [array addObject:@YES];//true
    [array addObject:YES];//Wrong
    
  2. YES/NO is BOOLs

Leo
  • 24,596
  • 11
  • 71
  • 92