`

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的语法与Cocoa框架

    ### Object-C的语法与Cocoa框架 #### 一、引言 Object-C是一种面向对象的编程语言,最初由Pike International开发,后被苹果公司采纳并成为Mac OS X和iOS应用开发的主要语言。Object-C是在C语言的基础上增加了面向...

    object-c基础教程

    - **nil**: Object-C中的空值表示,不同于C/C++中的`NULL`。 - **BOOL**: 在Object-C中,布尔类型不是语言的一部分,而是通过`Foundation`框架提供的。 - **#import vs #include**: 使用`#import`而非`#include`来...

    Object-C+经典入门教程

    ### Object-C+经典入门教程知识点概览 #### 开始篇:环境配置与基础知识 - **下载教学资源**:初学者可从提供的`objc.tar.gz`下载所有教学代码,便于实践学习。 - **环境设定**: - **Linux/FreeBSD**:需安装...

    Object-C_经典入门教程

    例如,Objective-C中使用nil来替代C语言中的NULL,而且在Objective-C中,传递消息给nil是合法的,这在C或C++中是无法实现的。另一个重要的概念是BOOL类型,在Objective-C中,布尔类型不是真正的数据类型,而是通过...

    Object-C 经典入门教程

    2. Objective-C基础:这部分内容讲解了Objective-C与C语言的关系,例如在C语言中使用NULL,在Objective-C中则使用nil。nil可以传递消息,但是NULL不可以。Objective-C使用BOOL来表示布尔值,它不同于C语言中的整型...

    Object-c学习文档

    ### Object-C 学习文档知识点总结 #### 开始学习Objective-C **下载教程:** - 所有的初学者指南原始代码可从`objc.tar.gz`下载。 - 许多示例来自Steve Kochan的《Objective-C 编程》一书。若需更深入的学习和示例...

    Object-C中文版

    **nil**:Objective-C中的`nil`类似于C/C++中的`NULL`,但可以安全地向`nil`发送消息。 - `nil`可以接收消息而不引发错误。 - 例如:`[nil message];`是合法的。 **BOOL**:Objective-C中的布尔类型。 - 在...

    object-c基础教程.

    2. BOOL数据类型:与C语言不同,Objective-C中的BOOL类型是包含在Foundation类库中,使用YES或NO表示布尔值,而不是TRUE或FALSE。 3. 头文件包含语法:在Objective-C中推荐使用#import来包含头文件,它类似于C语言...

    object-c基础教程移动版2.pdf

    18. nil与BOOL: 在Objective-C中,nil用来表示“无”,与C语言中的NULL类似。但Objective-C的BOOL类型包含了YES和NO,而不是C语言中的TRUE或FALSE,并且是定义在Foundation类库中的。 19. #import与#include: 在...

    Object-C 基础语法中文版

    ### Object-C 基础语法中文版 #### 开始吧 **下载这篇教学** 所有这篇初学者指南的原始码都可以由objc.tar.gz下载。这篇教学中的许多例子都是由Steve Kochan在他的书《Objective-C Programming》中撰写的。如果你...

    ObjectC经典入门教程

    - **目的与适用人群**:本教程旨在为初学者提供Object-C编程的基础知识,适用于有一定C语言基础的学习者。 - **下载资源**:教程提供了`objc.tar.gz`文件供下载,其中包含了初学者所需的代码示例。 #### 二、开发...

    20-C-ValueObject-Code.zip

    值对象(Value Object,VO)和数据传输对象(Data Transfer Object,DTO)是软件开发中的两种重要设计模式,尤其在C#这样的面向对象编程语言中,它们被广泛应用于数据管理和交换。下面将详细介绍这两种模式的概念、...

    详解protobuf-c之在C语言中如何使用repeated生成数组和字符串(包含配置pb-callback-t)

    protobuf-c是Google Protocol Buffers(protobuf)在C语言中的实现,它允许你在C代码中方便地序列化和反序列化结构化数据。本篇文章将详细解释如何在C语言环境中使用protobuf-c处理`repeated`字段,创建数组和字符串...

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

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

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

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

    StereoIssues

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

    Objective-C入门指南

    - **BOOL类型**: Objective-C中定义了`BOOL`类型,其值为`YES`或`NO`,而C语言中通常使用整型表示布尔值。 - **#import vs #include**: 在Objective-C中推荐使用`#import`而不是`#include`来导入头文件。`#import`...

Global site tag (gtag.js) - Google Analytics