`

【Objective-C】浅谈关于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. 

看一下用法 

Java代码  收藏代码
  1. NSURL *url = nil;  
  2. Class  class = Nil;  
  3. int *pointerInt = NULL;  

nil是一个对象指针为空,Nil是一个类指针为空,NULL是基本数据类型为空。这些可以理解为nil,Nil, NULL的区别吧。 
2、一个可以研究一下的问题 
在dealloc中 
Java代码  收藏代码
  1. -(void) dealloc  
  2. {  
  3. self.test = nil;   
  4. [_test release];  
  5. test = nil;  
  6. }  

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

再说self.test = nil;说明一下 属性和setter和getter方法就不难理解了 
Java代码  收藏代码
  1. -(void) setTest:(NSString *)newString  
  2. {  
  3. if(_test != newString)  
  4. [_test release];  
  5. _test = [newString retain];  
  6. }  
  7. -(NSString *)test  
  8. {  
  9. return  _test;  
  10. }  

这个是setter和getter方法,而在这个问题中相当于刚才的代码改变为 
Java代码  收藏代码
  1. if(_test != nil)  
  2. [_test release];  
  3. _test = nil;  

现在就比较容易解释了,setter方法会retain nil对象,在这之前已经先release了旧的对象,这个方法优点是成员变量连指向随机数据的机会都没有,而通过别的方式,就可能会出现指向随机数据的情况。当release了之后,万一有别的方法要用要存取它,如果它已经dealloc了,可能就会crash,而指向nil之后,就不会发生错误了。nil说白了就是计数器为0,这么说吧,当真正release一个对象的时候,NSLog是打印不了它指向的内存控件的,而当nil的时候,是可以打印出来指向的一个内存空间。 
那么现在也不难解释test = nil;  单纯的这种用法可以说是自己给自己制造内存泄露,这里可以这么理解,就是相当于将指向对象的指针直接和对象一刀两断了。直接让test指向nil,而内存实体不会消失,也不会有系统回收。
分享到:
评论

相关推荐

    [Objective-c程序设计].杨正洪等.扫描版

    《Objective-C程序设计》(作者杨正洪、郑齐心、李建国)通过大量的实例系统地介绍了Objective-C语言的基本概念、语法规则、框架、类库及开发环境。读者在阅读本书后,可以掌握Objective-C语言的基本内容,并进行...

    Objective-C培训资料

    Objective-C Objective-C Objective-C Objective-C 培训教程 主要章节提示: 第 一 章 程序整体语法结构 第 二 章 数据类型 第 三 章 字符串 第 四 章 内存管理 第 五 章 对象的初始化 第 六 章 存取器 第 ...

    ob<x>jective-C学习资料汇总专题

    资源名称:Objective-C学习资料汇总专题资源目录:【】Objective-C NSAutoreleasePool【】Objective-c 中 nil, Nil, NULL和NSNull的区别【】Objective-C 中self 和 super【】Objective-C 的编程之道【】Objective-C_...

    Google Objective-C Style Guide 中文版

    Google Objective-C Style Guide 中文版 目录 例子 空格与格式 空格与制表符 行宽 方法声明与定义 方法调用 @public与@private 异常 协议 命名 文件名 Objective-C++ 类名 分类名 Objective-C方法名 变量名 注释 ...

    Objective-c对象组装XML

    [map setObject:@"c" forKey:@"content"]; 或者 NSMutableArray *list = [[NSMutableArray alloc]init]; NSMutableDictionary *map1 = [[NSMutableDictionary alloc]init]; [map1 setObject:@"a1" forKey:@...

    Using Swift with Cocoa and Objective-C完整中文CocoaChina精校版

    使用 nil (Working with nilWorking with nilWorking with nilWorking with nil Working with nil Working with nil Working with nil Working with nil ) . 11 扩展( Extensions Extensions Extensions ...

    objective-c小技巧

    objective-c小技巧 1. 使用@property和@synthesize声明一个成员变量,给其赋值是时要在前面加上"self.",以便调用成员变量的setmember方法。 直接调用成员变量并且给其赋值:member=[NSString stringWithFormat...

    总结IOS中nil、Nil、NULL和NSNull区别

    相信有不少朋友想知道,在 Objective-C 中 nil 和 Nil 以及 NULL 的区别。最重要的是,在面试中还有不少朋友常会被问到。现在小编在这里统一详细说明。

    lua-cjson decode中null改成nil

    lua-cjson lua的cjson库 decode略做修改 结果中null还原成nil

    ios-清理模型中的nil.zip

    清理字典转模型后模型中的nil,属性多于字典,服务器返回为null等情况

    object c 编程

    n nil:在 C/C++ 你或许曾使用过 NULL,而在 Objective-C 中则是 nil。不同之 处是你可以传递讯息给 nil(例如 [nil message];),这是完全合法的,然而你 却不能对 NULL 如法炮制。 n BOOL:C 没有正式的布尔型别,...

    IGScraperKit:在 Objective-C 或 Ruby 中创建动态网页抓取工具!

    在 Objective-C 或 Ruby 中创建动态网络爬虫。 用法 创建一个刮板: # import " IGScraperKit.h " IGScraper* scraper = [IGScraper scraperWithBlock: ^ id (IGXMLNode* node, NSString * url) { return [[[node...

    Objective-C封装字符串存储操作示例

    Objective-C简单封装 字符串的存储操作,省去中间沙盒处理方式 代码如下:/存储publickey和sessionID — writeContent: nil - 仅取出数据, 其他 - 修改原内容并提取+(NSString *)storeFile:(NSString *)fileName...

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

    IOS 基础之nil,NULL,NSNULL区别详解 ① nil:一般赋值给空对象。 ② NULL:NULL 是一个通用指针(泛型指针)。 一般赋值给 nil 之外的其他空值。如SEL等。 ③ NSNULL:[NSNull null] 是一个对象,他用在不能使用 ...

    Xcode-Singleton-Templates:Objective-C 的单例模板

    Xcode-Singleton-Templates 这些是 Singleton 类和 TestCase 的模板。 下面显示的代码是将通过的测试用例模板的一部分。 KO2Abc* a = [KO2Abc sharedInstance]; KO2Abc* b = [[KO2Abc alloc] init]; KO2Abc* c = [KO...

    XMLReader:基于NSXMLParser的Objective-C XML阅读器

    XMLReader 该项目来自Troy Brant开发的组件,该组件发布在他的网站上: : 我正在公开采购我对此所做的一些更新。 用法 NSData *data = ...; // some data that can be received ...Xcode 4.4及更高版本,因为项目使

    Objective-C基础api

    NSArray* array= [NSArray arrayWithObjects:@110,@120, nil]; NSLog(@--%@,array); NSLog(@count==%lu,[array count]); //2.数组遍历 for(int i=0;i&lt;[array count];i++){ NSLog(@count==%@, [array obje

Global site tag (gtag.js) - Google Analytics