关于nil和 null和NSNull的相关问题

关于nil和 null和NSNull的区别及相关问题

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

nil -> Null-pointer to objective- c objectspa

NIL -> Null-pointer to objective- c class指针

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

看一下用法对象

NSURL *url = nil;内存

Class  class = Nil;get

int *pointerInt = NULL;it

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


二、NSNULL,NULL和nil在本质上应该是同样的,NULL和nil其实就是0,可是在Objective-c中,对于像NSArray这样的类型,nil或NULL不能作为加到其中的Object,若是定义了一个NSArray,为其分配了内存,又想设置其中的内容为空,则能够用[NSNULL null返回的对对象来初始化NSArray中的内容,个人感受有点像C语言中malloc一个内存空间,而后用memset初始化这段空间里的值为0。class

 

  1. _viewControllers = [[NSMutableArray alloc] init];  

  2. for (unsigned i = 0; i < _pages; i++) {  

  3. [_viewControllers addObject:[NSNull null]];  

  4. }  

  5. ymBaseController *controller = [_viewControllers objectAtIndex:page];  

  6.          if ((NSNull *)controller == [NSNull null])   

  7.     {  

  8. ...  

  9.             }  

  10.     [_viewControllers replaceObjectAtIndex:page withObject:controller];  


三、一个能够研究一下的问题
在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,而内存实体不会消失,也不会有系统回收。

相关文章
相关标签/搜索