`

Object-C之(Null)与(Bool)

 
阅读更多
在写iOS程序的时候,想初始化一个空值的时候,经常会迷茫到底是用nil,null还是NSNull, 想定义一个布尔值的变量时,又需要去想想应该用bool,BOOL抑或Boolean,赋值的时候应应该给YES/NO还是true/false。今天正好来理一下。

nil/Nil/NULL/NSNull

Matt Thompson总结了这4个变量的不同之处:
Symbol Value Meaning
NULL (void *)0 literal null value for C pointers
nil (id)0 literal null value for Objective-C objects
Nil (Class)0 literal null value for Objective-C classes
NSNull [NSNull null] singleton object used to represent null


NULL是C语言中用来指代一个空指针的,Object-C是C语言的超集,可以使用C语言中特性,因此当你处于C语言语义下的时候应该使用NULL。比方说初始化一个结构体等
struct MyStruct *dStruct = NULL;


nil指代的是一个指向空的对象指针,因此当你初始化一个对象为空的时候,应该使用nil,另外,在java中,如果你去调用空对象的方法时,会抛出NullPointerException,在obj-c中,会返回0。因此,在obj-c中,通常情况下是不需要去做空对象判断的。即:

    if (obj !=nil && [obj isPass]) {
        //do something
    }
完全可以简化为

    if ([obj isPass]) {
        //do something
    }
   
Nil指代的是一个指向空的类指针,用的情况很少,当期望返回值为一个类的时候,空值应该使用Nil。

NSNull提供了一个类方法来生成一个单例的空对象, 这个类是由Foundation框架引入的,主要是为了绕过Obj-c中的集合类,NSArray,NSDictionary等不能放nil值的约束的。可以把其看做是一个可以用于集合类的nil的封装。
NSMutableDictionary *mutableDictionary = [NSMutableDictionary dictionary];
mutableDictionary[@"Key-1"] = [NSNull null]; 
NSLog(@"Keys: %@", [mutableDictionary allKeys]);


BOOL/bool/Boolean/NSCFBoolean
Matt Thompson对这几个变量的不同之处的归纳如下:
Name Typedef Header True Value False Value
BOOL signed char objc.h YES NO
bool _Bool (int) stdbool.h true false
Boolean unsigned char MacTypes.h TRUE FALSE
CFBooleanRef struct CoreFoundation.h kCFBooleanTrue kCFBooleanFalse


简单来说,在Obj-C中,都应该使用BOOL,然后使用YES和NO。这会帮你避免很多头疼的问题,当你遇到问题的时候,比方说这个问题:http://blog.bignerdranch.com/564-bools-sharp-corners/
你可以通过上表中的差别,来定位问题。
分享到:
评论
1 楼 繁星水 2017-03-10  
Useful!!

相关推荐

    Object-c 语法快速入门

    Objective-C里的NULL(空)就这么写,表示空指针。 6、为什么是@”字符串”而不是”字符串” 前面加上@符号,编译器在编译的时候会在程序中给你留出位置,这样才能保证这个字符串不会丢失。反正记住,如果你...

    Objective-C培训资料

    Object-c 提供了 BOOL 类型,但这个 BOOL 类型和 C++ 里的并不一样:在 C++ 里一切非 0 值的东西 都 为 true ,而为 0 值的为 false 。但是 Object-c 里 1 为 true 并被宏定义为 YES , 0 为 false 并被宏定义为 NO

    number 数字string 字符串bool 布尔undefined 未定义null 空Array 数组Object 对象var.md

    number 数字string 字符串bool 布尔undefined 未定义null 空Array 数组Object 对象var.md

    StereoIssues

    gTxtHelper = new CDXUTTextHelper(NULL, NULL, gFont10, gSprite10, 15); // Create our stereo parameter texture V_RETURN(CreateStereoParamTextureAndView(d3d10)); // Initialize the stereo texture ...

    gjk C++应用代码(碰撞问题)

    #include "sceneGraph/sceneObject.h" #include "collision/convex.h" #include "collision/gjk.h" //---------------------------------------------------------------------------- static F32 rel_error = 1E...

    object c 编程

    n BOOL:C 没有正式的布尔型别,而在 Objective-C 中也不是「真的」有。它 是包含在 Foundation classes(基本类别库)中(即 import NSObject.h;nil 也 是包括在这个标头档内)。BOOL 在 Objective-C 中有两种型态...

    to-bool:将类型转换为布尔值

    ),它适用于null (因为typeof null === "object" ) 字符串将转换为小写并与"true"或"1" Symbol目前被视为永远为真未定义始终为假如果这些类型都不与传递的项目匹配,则抛出TypeError 。用法使用非常简单: var ...

    进程同步实验代码 图书馆 ,登记,注册使用 CreateMutex,WaitForSingleObject

    图书馆登记和注销 要求:有一阅览室,读者进入时必须先在一张登记表上登记。... CONST HANDLE *lpHandles, // object-handle array BOOL bWaitAll, // wait option DWORD dwMilliseconds // time-out interval );

    进程同步实验代码 司机售票员 使用window带的函数

    汽车司机与售票员之间必须协同工作,一方面,只有售票员把车门关好了司机才能开车,因此,售票员关好车门应通知司机开车。另一方面,只有当司机已经停 下,售票员才能开门上下客,故司机停车后应通知售票员。假定某...

    yamlify-object:使用Yaml语法对对象数组进行字符串化

    yamlify对象 使用yaml语法对对象/数组进行字符串化 安装 npm install yamlify-object 用法 const yamlifyObject = require ( 'yamlify-object... null : null , undefined : undefined , emptyObject : { } , } , }

    操作系统 进程同步和互斥代码 os 奇偶数 (具体要求请看资源描述)

    三个进程P1,P2,P3,以及有N(>1)个单元的缓冲区。P1调用produce()产生一个整数,... CONST HANDLE *lpHandles, // object-handle array BOOL bWaitAll, // wait option DWORD dwMilliseconds // time-out interval );

    C#版ActiveX + JS +Flex通讯 完整实现

    因項目部署需要,特把之前寫的與讀卡器通訊的模塊改為ActiveX插件,給Flash調用,由於Flash不能直接調用ActiveX,所以,用JS作為中間層,作為Flash和ActiveX通訊的橋梁。 開發環境:WINXP _EN 開發工具:VS2005,...

    react-native-sf-stars

    bool no 是否可以点击星星 true starSpace Number no 星星之间的间距 5 style object no 可设置除宽度,高度,布局外的属性(例如:margin) null MaxStar Number yes 最大星星个数 5 Methods Methods P

    酒店系统管理C#语言开发的

    protected override void Dispose( bool disposing ) { if( disposing ) { if (components != null) { components.Dispose(); } } base.Dispose( disposing ); } #region ...

    Objective-C处理空字符串和页面传值及自定义拷贝

    空字符串 在ios应用中,如果从网络请求数据,返回json或者是xml格式的数据时,经常会遇到空串,一般接口...-(BOOL)isNull:(id)object {  // 判断是否为空串  if ([object isEqual:[NSNull null]]) {  return NO;  }

    JSONBuilder - C#扩展版

    public delegate string ToJSONDelegate(object value, bool useSingleQuote); //-->JSONBuilderTest.cs 比如: //demo custom class public class CustomClass { public string name = "Hu Changwei";...

    mysqlhelper

    object obj2 = command.ExecuteScalar(); CloseConnect(); if (obj2 == null) { return ""; } return obj2.ToString(); } /// /// 返回一个SqlDataReader对象 /// /// 要执行的SQL命令语句 /// ...

    层次路径递归创建文件实例

    printf("Directory: '%s'\n", it.filename().c_str()); else printf("File: '%s'\n", it.filename().c_str()); } \endcode */ class dir_iter { public: dir_iter(); dir_iter(const char*dirname); dir_...

    android QQ手机安全助手 反编译源码

    Object localObject3 = null; } } public ArrayList getListDownSoftItems() { return this.listDownSoftItems; } public int getNGUID() { return this.nGUID; } public String getSQUA() { ...

Global site tag (gtag.js) - Google Analytics