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,NULL,NSNULL区别详解 ① nil:一般赋值给空对象。 ② NULL:NULL 是一个通用指针(泛型指针)。 一般赋值给 nil 之外的其他空值。如SEL等。 ③ NSNULL:[NSNull null] 是一个对象,他用在不能使用 ...
lua-cjson lua的cjson库 decode略做修改 结果中null还原成nil
相信有不少朋友想知道,在 Objective-C 中 nil 和 Nil 以及 NULL 的区别。最重要的是,在面试中还有不少朋友常会被问到。现在小编在这里统一详细说明。
将所有其他nil值转换为null。 例子 var noNil = require ( 'no-nil' ) ; var input = [ 1 , undefined ] ; console . log ( noNil ( input ) ) ; // [1]; ##执照 The MIT License (MIT) Copyright (c) 2015 ...
主要介绍了iOS中nil、Nil、NULL、NSNull详解的相关资料,需要的朋友可以参考下
IOS 开发之对象为空的判断(nil、null)详解 前言: 在开发中,会遇到很多空的情况,有时候取得对象(null),还有时候会得到<null>的情况,我们需要判断是否为空,进行return; id result; // 针对(null)这种...
清理字典转模型后模型中的nil,属性多于字典,服务器返回为null等情况
在iOS开发过程中经常需要与服务器进行数据通讯,Json就是一种常用的高效简洁的数据格式,通过本文给大家介绍iOS中json解析出现的null,nil,NSNumber的解决办法,感兴趣的朋友参考下
在内部,接口值可以看做包含值和具体类型的元组: (value, type) 接口值保存了一个具体底层类型的具体值。 接口值调用方法时会执行其底层类型的同名方法。 nil接口 即便接口内的具体值为 nil,方法仍然会被 nil 接收...
大多数计算机语言,有且仅有一个表示”无”的值,比如,C语言的NULL,Java语言的null,Python语言的None,Ruby语言的nil。 有点奇怪的是,JavaScript语言居然有两个表示”无”的值:undefined和null。这是为什么? ...
一个关于数组越界、字典key与value为nil情况下导致的低级错误的线上Crash的避免的仓库
特别是,我们找到了带电Solv和Nil几何层的解决方案。 我们还发现Nil黑洞具有超标度违规。 对于我们所有的解决方案,我们计算相应双场理论的热电直流输运系数。 我们发现没有超标度违规的Solv和Nil黑洞对金属是双重...
Go文档中说明:nil是预定义的标识符,代表指针,通道,函数,接口,映射或者切片的零值,并不是Go的关键字之一。 还有,nil只能赋值为以上的几个类型,若赋值给基础类型,则会引发panic 2.nil的作用 指针(pointer)...
大多数计算机语言,有且仅有一个表示"无"的值,比如,C语言的NULL,Java语言的null,Python语言的none,Ruby语言的nil
消除空白 在Rails中,当从表单保存模型并且用户不提供值时,会将空字符串记录到数据库中,而不是像许多人希望的那样记录为NULL(混合空白和NULL可能会造成混淆)。 使用此插件,您可以指定属性列表(或所有属性的...