对于想了解nil/Nil/NULL/NSNull的读者,本文将提供新的信息,并且为您提供关于failedtoparse:{"row":[8,6,12,7,13,8,14],"meta":[null,n
对于想了解nil / Nil / NULL / NSNull的读者,本文将提供新的信息,并且为您提供关于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、NULL和NSNull 的使用、iOS 中 nil、NSNULL、Nil、IOS 基础之nil,NULL,NSNULL区别详解的有价值信息。
本文目录一览:- nil / Nil / NULL / NSNull
- 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、NULL和NSNull 的使用
- iOS 中 nil、NSNULL、Nil
- IOS 基础之nil,NULL,NSNULL区别详解
nil / Nil / NULL / NSNull
理解“不存在”的概念不仅仅是一个哲学的问题,也是一个实际的问题。我们是 有形 宇宙的居民,而原因在于逻辑宇宙的存在不确定性。作为一个逻辑系统的物理体现,电脑面临一个棘手的问题,就是如何用 存在 表达 不存在 .
在 Objective-C 中,有几个不同种类的 不存在。这样做的原因要追溯到一个频繁提及的NSHipster,讲解 Objective-C 如何在 C 的程序范例以及由 Smalltalk 启发的面向对象的范例中架起桥梁的。
C 用 0
来作为 不存在 的原始值,而 NULL
作为指针(这在指针环境中相当于0
)。
Objective-C 在 C 的表达 不存在 的基础上增加了 nil
。nil
是一个指向不存在的 对象 指针。虽然它在语义上与 NULL
不同,但它们在技术上是相等的。
在框架层面,Foundation 定义了 NSNull
,即一个类方法 +null
,它返回一个单独的 NSNull
对象。NSNull
与 nil
以及 NULL
不同,因为它是一个实际的对象,而不是一个零值。
另外,在 Foundation/NSObjCRuntime.h 中,Nil
被定义为指向零的 类 指针。这个nil
的鲜为人知的大写的表兄并不常常出现,但它至少值得注意。
关于 nil
的一些事
刚被 分配
的 NSObject
的内容被设置为0
。也就是说那个对象所有的指向其他对象的指针都从 nil
开始,所以在 init
方法中设置 self.(association) = nil
之类的表达是没有必要的。
也许 nil
最显著的行为是,它虽然为零,仍然可以有消息发送给它。
在其他的语言中,比如 C++,这样做会使你的程序崩溃,但在 Objective-C 中,在 nil
上调用方法返回一个零值。这大大的简化了表达,因为它避免了在使用 nil
之前对它的检查:
// 举个例子,这个表达...
if (name != nil && [name isEqualToString:@"Steve"]) { ... } // …可以被简化为: if ([name isEqualToString:@"steve"]) { ... }
了解 nil
如何在 Objective-C 中工作可以让你将这个便利变成一个功能,而不是潜伏在你的应用中的 bug。要确保避免当 nil
值不需要的情况,要么通过检查或者提前返回来安静的失败,或者通过增加一个 NSParameterAssert
来抛出异常。
NSNull
:有作没有
NSNull
在 Foundation 和其它框架中被广泛的使用,以解决如 NSArray
和 NSDictionary
之类的集合不能有 nil
值的缺陷。你可以将 NSNull
理解为有效的将 NULL
或者 nil
值封装boxing,以达到在集合中使用它们的目的:
NSMutableDictionary *mutableDictionary = [NSMutableDictionary dictionary]; mutableDictionary[@"someKey"] = [NSNull null]; // Sets value of NSNull singleton for `someKey` NSLog(@"Keys: %@", [mutableDictionary allKeys]); // @[@"someKey"]
总的来说,这里的四个表达 没有 的值是每个 Objective-C 程序员都应该知道的:
标志 | 值 | 含义 |
---|---|---|
NULL | (void *)0 | C指针的字面零值 |
nil | (id)0 | Objective-C对象的字面零值 |
Nil | (Class)0 | Objective-C类的字面零值 |
NSNull | [NSNull null] | 用来表示零值的单独的对象 |
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、NULL和NSNull 的使用
nil用来给对象赋值(Objective-C中的任何对象都属于id类型),NULL则给任何指针赋值,NULL和nil不能互换,nil用于类 指针赋值(在Objective-C中类是一个对象,是类的meta-class的实例), 而NSNull则用于集合操作,虽然它们表示的都是空值,但使用的场合完全不同。
示例如下:
id object = nil;
// 判断对象不为空
if (object) {
}
// 判断对象为空
if (object == nil) {
}
// 数组初始化,空值结束
NSArray *array = [[NSArray alloc] initWithObjects:@"First", @"Second", nil];
// 判断数组元素是否为空
NSString *element = [array objectAtIndex:2];
if ((NSNull *)element == [NSNull null]) {
}
今天做项目的时候就遇到,要判断数组元素是否为空,我的以下写法,都无效
if(!element)
if([element length]>0)
if(element== NULL)
if(element == Nil)
// 判断字典对象的元素是否为空
NSDictionary *dictionary = [NSDictionary dictionaryWithObjectsAndKeys:
@"iPhone", @"First", @"iPad", @"Second", nil];
NSString *value = [dictionary objectForKey:@"First"];
if ((NSNull *)value == [NSNull null]) {
}
欢迎大家继续补充他们的区别。
加深理解一
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,而内存实体不会消失,也不会有系统回收。
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区别详解
① 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详解
今天关于nil / Nil / NULL / NSNull的分享就到这里,希望大家有所收获,若想了解更多关于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、NULL和NSNull 的使用、iOS 中 nil、NSNULL、Nil、IOS 基础之nil,NULL,NSNULL区别详解等相关知识,可以在本站进行查询。
本文标签: