GVKun编程网logo

ios nil、NULL和NSNull 的使用(ios的null是什么)

26

在本文中,我们将为您详细介绍iosnil、NULL和NSNull的使用的相关知识,并且为您解答关于ios的null是什么的疑问,此外,我们还会提供一些关于C++——NULL、0、nullptr、fai

在本文中,我们将为您详细介绍ios nil、NULL和NSNull 的使用的相关知识,并且为您解答关于ios的null是什么的疑问,此外,我们还会提供一些关于C++——NULL、0、nullptr、failed to parse: {"row":[8,6,12,7,13,8,14],"meta":[null,null,null,null,null,null,null]}]} 11:46:29.8、iOS 中 nil、NSNULL、Nil、IOS 基础之nil,NULL,NSNULL区别详解的有用信息。

本文目录一览:

ios nil、NULL和NSNull 的使用(ios的null是什么)

ios nil、NULL和NSNull 的使用(ios的null是什么)

nil用来给对象赋值(Objective-C中的任何对象都属于id类型),NULL则给任何指针赋值,NULL和nil不能互换,nil用于类 指针赋值(在Objective-C中类是一个对象,是类的meta-class的实例), 而NSNull则用于集合操作,虽然它们表示的都是空值,但使用的场合完全不同。

示例如下:

  1. id object = nil;  

  2. // 判断对象不为空  

  3. if (object) {  

  4. }  

  5.       

  6. // 判断对象为空  

  7. if (object == nil) {  

  8. }  

  9.           

  10. // 数组初始化,空值结束  

  11. NSArray *array = [[NSArray alloc] initWithObjects:@"First", @"Second", nil];  

  12.   

  13. // 判断数组元素是否为空  

  14. NSString *element = [array objectAtIndex:2];  

  15. if ((NSNull *)element == [NSNull null]) {  

  16. }  

今天做项目的时候就遇到,要判断数组元素是否为空,我的以下写法,都无效

if(!element)

if([element length]>0)

if(element== NULL)

if(element == Nil)

 

 

  1.   

  2. // 判断字典对象的元素是否为空  

  3. NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:  

  4.     @"iPhone", @"First", @"iPad", @"Second", nil];  

  5. NSString *value = [dictionary objectForKey:@"First"];  

  6. if ((NSNull *)value == [NSNull null]) {  

  7. }  

欢迎大家继续补充他们的区别。

加深理解一

 

1、nil:一般赋值给空对象;

2、NULL:一般赋值给nil之外的其他空值。如SEL等;

  举个栗子(好重啊~):

    [NSApp beginSheet:sheet
                modalForWindow:mainWindow

                modalDelegate:nil //pointing to an object

                didEndSelector:NULL //pointing to a non object/class

                contextInfo:NULL]; //pointing to a non object/class

3、NSNULL:NSNull只有一个方法:+ (NSNull *) null;

  [NSNull null]用来在NSArray和NSDictionary中加入非nil(表示列表结束)的空值.   [NSNull null]是一个对象,他用在不能使用nil的场合。

4、当向nil发送消息时,返回NO,不会有异常,程序将继续执行下去;

  而向NSNull的对象发送消息时会收到异常。

 

因为在NSArray和NSDictionary中nil中有特殊的含义(表示列表结束),所以不能在集合中放入nil值。如要确实需要存储一个表示“什么都没有”的值,可以使用NSNull类。NSNull只有一个方法:

+ (NSNull *) null;


nil是一个对象指针为空,Nil是一个类指针为空,NULL是基本数据类型为空。这些可以理解为nil,Nil, NULL的区别吧。

 

加深理解二

 

浅谈关于nil和 null区别及相关问题

 

 

1、nil和null从字面意思来理解比较简单,nil是一个对象,而NULL是一个值,我的理解为nil是将对象设置为空,而null是将基本类 型设置为空的,个人感觉有点像属性当中,基本类型分配为assign NSString类型一般分配copy,而对象一般用retain。而且我们对于nil调用方法,不会产生crash或者抛出异常。

看一段

nil -> Null-pointer to objective- c object

NIL -> Null-pointer to objective- c class

null-> null pointer to primitive type or absence of data.

看一下用法

NSURL *url = nil;

Class  class = Nil;

int *pointerInt = NULL;

nil是一个对象指针为空,Nil是一个类指针为空,NULL是基本数据类型为空。这些可以理解为nil,Nil, NULL的区别吧。

2、一个可以研究一下的问题

在dealloc中

-(void) dealloc

{

self.test = nil; 

[_test release];

test = nil;

}

这几个的区别

先说最简单的  [_test release]; 这个就是将引用技术减1,所谓的引用计数就是看看有多个指针指向一块内存实体,当release一次,就是指针减少一个,release到了0的时候,就是真正把这块内存归还给系统的时候了

 

再说self.test = nil;说明一下 属性和setter和getter方法就不难理解了

 

-(void) setTest:(NSString *)newString

{

if(_test != newString)

[_test release];

_test = [newString retain];

}

-(NSString *)test

{

return  _test;

}

这个是setter和getter方法,而在这个问题中相当于刚才的代码改变为

if(_test != nil)

[_test release];

_test = nil;

现在就比较容易解释了,setter方法会retain nil对象,在这之前已经先release了旧的对象,这个方法优点是成员变量连指向随机数据的机会都没有,而通过别的方式,就可能会出现指向随机数据的 情况。当release了之后,万一有别的方法要用要存取它,如果它已经dealloc了,可能就会crash,而指向nil之后,就不会发生错误了。 nil说白了就是计数器为0,这么说吧,当真正release一个对象的时候,NSLog是打印不了它指向的内存控件的,而当nil的时候,是可以打印出 来指向的一个内存空间。

那么现在也不难解释test = nil;  单纯的这种用法可以说是自己给自己制造内存泄露,这里可以这么理解,就是相当于将指向对象的指针直接和对象一刀两断了。直接让test指向nil,而内存实体不会消失,也不会有系统回收。


C++——NULL、0、nullptr

C++——NULL、0、nullptr

NULL在C/C++下的不同定义

在C++中,NULL就是0,定义如下

在C中,NULL就数字0

在C++中,NULL是个万能指针,可以代表指向0地址的任何数据类型

#ifndef NULL
    #ifdef __cplusplus
        #define NULL 0
    #else
        #define NULL ((void *)0)
    #endif
#endif

不过由于C++ 11逐渐普及,你应该使用nullptr代替NULL。

数字0,本身没有啥特殊意义。但是如有用在地址身上,那就会有段错误(segmentation fault)的潜在风险(如果后面你忘记对地址赋有效值)。32位x86 CPU下,从C/C++程序员角度看到的内存是2^32大小的虚拟地址空间,0地址是禁止用户代码使用的。有的操作系统可能允许你读0地址,但是写是绝对不可以的,Linux读写都不允许。一般读0地址可能如下形式,虽然使用者以及很小心,知道用const char*限制修改0地址,但是读0地址在编译器看来确是合法的,这种错误编译时期不会发现,运行时在某些操作系统下会报错。

char z = *(const char*)0;

 

_cplusplus是编译器预定于宏

//For C
gcc -dM -E - < /dev/null

//For C++
g++ -dM -E -x c++ - < /dev/null

//__cplusplus就是这么定义的
root@ubuntu:~# g++ -dM -E -x c++ - < /dev/null | grep __cplusplus
#define __cplusplus 199711L

 

snprintf

如下代码用于string与long long int之间相互转换

static inline string i64tostr(long long i64)
{
    char buf[64] = { 0 };
    snprintf(buf, sizeof(buf), "%lld", i64);
    return string(buf);
};

static inline int64_t strtoi64(const string str)
{
    return strtoll(str.c_str(), 0, 10);      //OK,三者选一个就行
    return strtoll(str.c_str(), NULL, 10);   //OK,三者选一个就行
    return strtoll(str.c_str(), nullptr, 10);//OK,三者选一个就行
}

snprintf使用

int snprintf ( char * s, size_t n, const char * format, ... );

n表示打算写入buff的最大长度

#include <stdio.h>
#include <stdlib.h>
int main()
{
    char buffer1[100];
    int cx;
    cx = snprintf(buffer1, 100, "The half of %d is %d", 60, 60 / 2);
    if (cx >= 0 && cx < 100) {
        snprintf(buffer1 + cx, 100 - cx, ", and the half of that is %d.", 60 / 2 / 2);
    }
    puts(buffer1);//The half of 60 is 30, and the half of that is 15.

    //################################################################################

    char buffer2[16];
    size_t i;

    i = snprintf(buffer2, 5, "%s", "1234");  // 第 1 种情况
    printf("i = %d, buffer2 = %s\n", i, buffer2);    // 输出:i = 4, buffer2 = 1234

    i = snprintf(buffer2, 5, "%s", "123456");   // 第 2 种情况
    printf("i = %d, buffer2 = %s\n", i, buffer2);    // 输出:i = 6, buffer2 = 1234

    system("pause");
    return 0;
}

 

failed to parse: {

failed to parse: {"row":[8,6,12,7,13,8,14],"meta":[null,null,null,null,null,null,null]}]} 11:46:29.8

IDEA整合springboot与neo4j时出现这个问题

iOS 中 nil、NSNULL、Nil

iOS 中 nil、NSNULL、Nil

一、起因

参与一个比较成熟的项目的开发,刚好项目新功能上线。结果上线 4 天奔溃 2 千个,我看了下倒吸一口凉气。当时,最后排查出来是很简单的原因新用户注册时 H5 返回给 iOS 壳中 <NULL> 类型数据的处理不当导致于奔溃(不能给 NULL 类型发送消息)。这代码要是我写的我想能够我吹一辈子。换而言之,就是扼杀了那么多用户。我们开发的一行代码糟蹋了多少钱多少运营。虽然这牛逼的 bug 不是我出品,但是也是狠狠的给我上了一课,所以写此篇博客警醒自己。

二、重温

1. 基本概念

nil:Defines the id of a null instance(官方),指向一个(实例)对象的空指针。                      NULL:指向其他类型(如:基本类型、C 类型)的空指针
Nil:Defines the id of a null class(官方),指向一个类的空指针
NSNull:通常表示集合中的空值

nil 和 NULL

nil 是指向对象的的指针,针对的是对象,我们 O-C 是面向对象的东西。但是 NULL 是 C 类型的指针,C 语言是一门面向过程的语言。NULL 是 c 语言中指向基础类型的指针,如 int 等针对的是数据。不要使用 NULL 去重置对象,可能会产生异常。当我们将一个对象释放掉的时候将对象置为 nil 避免野指针。

nil 和 NSNULL

nil 是 O-C 中针对于对象使用的,但是容器对象无法包含 nil,如集合、字典和数组。所以 nil 类型的值我们使用 NSNull 来存储。当我们想给容器存 nil 类型的值时,不能直接将 nil 存储进去,存储 nil 类型到容器中会产生崩溃。setValuesForKeysWithDictionary 和 ditionaryWithValuesForKeys 方法可以将 NSNull 和 nil 相互转换。不能给 NSNULL 类型发送消息,会发生崩溃。

josn 字符中的 null 通过 NSJSONSerialization 类转换后,可能产生 (null) 或 < null > 类型,当我们在 O-C 中使用对象去接受这些东西的时候,一定要进行安全判断是否为(null)或者 < null>。我碰到的就是返回了 < null > 类型,使用了 NSString 接收后,将 str 传递给注册方法的时候方法内部产生异常。我们在写代码的过程中为了程序的健壮性对于需要进行判断的一定不能生。虽然对于 nil 类型判断没有必要,因为给 nil 类型发送消息也不会崩溃,但是可以提高代码运行速度(http://xuzhe.com/?p=630)更能养成一个好的编程习惯,写出更好的代码。

我们判断是否有 NSNULL 类型数据的时候需要这样判断

针对 <null> 的情况

if([result isEqual:[NSNUll null]]) { 

    NSLog (@"执行");

}

Nil

Nil 是针对类对象的空,对此和 nil 发送消息不会产生崩溃。

三、一个很牛逼的方案

此次为补充,写完博客后就一直注意这方面的消息。在 git 上找到了一个很牛逼的第三方,可以避免给 NULL 类型发消息导致的崩溃。即时你工程中有此崩溃,恭喜你,你现在不用苦苦排查此崩溃在何处,亲测 NULL 导致的崩溃可以避免,使用方式十分简单。下载后倒入.m 文件就可以,。牛的一比,使用到了比较底层的技术,抽空在此补充分析下,先供上连接给有需要的人。帮助到的人感谢下我,把快乐传递下,谢谢哈

https://github.com/nicklockwood/NullSafe

 

 

IOS 基础之nil,NULL,NSNULL区别详解

IOS 基础之nil,NULL,NSNULL区别详解

IOS 基础之nil,NULL,NSNULL区别详解

① nil:一般赋值给空对象。

② NULL:NULL 是一个通用指针(泛型指针)。

一般赋值给 nil 之外的其他空值。如SEL等。

③ NSNULL:[NSNull null] 是一个对象,他用在不能使用 nil 的场合。

因为在 NSArray 和 NSDictionary 中 nil 有特殊的含义(表示列表结束),所以不能在集合中放入 nil 值。如要确实需要存储一个表示“什么都没有”的值,可以使用 NSNull 类。NSNull只有一个方法:

+ (NSNull *) null;

④ 当向 nil 发送消息时,返回 NO,不会有异常,程序将继续执行下去。

而向 NSNull 的对象发送消息时会收到异常。

实例:

nil 是对objective c id 对象赋空值

例如

NSString * string = [NSString stringWithFormat:@"test"];
  string = nil;

对于objective c 集合类对象 比如数组对象,字典对象,当我们不需要再使用他们的时候,对他们release 的同时最好也把他们赋值为nil,这样确保安全性,下面一个简单的一个例子:如果不赋值nil,可能导致程序崩溃

NSArray * array = [NSArray arrayWithObjects:@"test",@"test1" ,nil];
  [array release];
  
  if (array)
  {
    //仅仅对数组release,并没有赋空值的话,在程序某个地方如果继续对数组操纵,程序直接崩溃
    NSString * string = [array objectAtIndex:0];
    NSLog(@"%@",string);
  }

编程的时候对集合类对象先赋值为nil,再将其release这样可以保证程序安全性,苹果官方例子中也看到过viewDidUnload把对象赋值nil,然后在dealloc方法中将他们release,

Nil: A null pointer to an Objective-C class.表示对类进行赋空值

NULL: A null pointer to anything else,  is for C-style memory pointers. 用于对非对象指针赋空值,比如C指针

NSNull 对于像NSArray这样的类型,nil或NULL不能做为加到其中的Object,如果定义了一个NSArray,为其分配了内存,又想设置其中的内容为空,则可以用[NSNULL null】返回的对象来初始化NSArray中的内容

感谢阅读,希望能帮助到大家,谢谢大家对本站的支持!

您可能感兴趣的文章:
  • 总结IOS中nil、Nil、NULL和NSNull区别
  • iOS中nil、Nil、NULL、NSNull详解

我们今天的关于ios nil、NULL和NSNull 的使用ios的null是什么的分享就到这里,谢谢您的阅读,如果想了解更多关于C++——NULL、0、nullptr、failed to parse: {"row":[8,6,12,7,13,8,14],"meta":[null,null,null,null,null,null,null]}]} 11:46:29.8、iOS 中 nil、NSNULL、Nil、IOS 基础之nil,NULL,NSNULL区别详解的相关信息,可以在本站进行搜索。

本文标签: