• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    迪恩网络公众号

ObjectiveC中NULL、Nil、nil、NSNull的区别

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

NULL Values
These macros define null values for classes and instances.
NULL可以用在C语言的各种指针上
#define __DARWIN_NULL #define __DARWIN_NULLConstants

c 特有的,例子:

int *pointerToInt = NULL;
char *pointerToChar = NULL;
struct TreeNode *rootNode = NULL;

 

 

nil
Defines the id of a null instance.

定义一个实例为空。
Available in Mac OS X v10.0 and later.
Declared in MacTypes.h.

使用例子代码:

NSString *someString = nil;
NSURL *someURL = nil;
id someObject = nil;

if (anotherObject == nil) // do something

 


Nil
Defines the id of a null class. 定义一个空的类
Available in Mac OS X v10.0 through Mac OS X v10.4.
Declared in NSObjCRuntime.h.
Declared Inobjc.h

使用例子代码:

Class someClass = Nil;
Class anotherClass = [NSString class];

 

NSNull

集合对象无法包含nil作为其具体值,如NSArrayNSSetNSDictionary。相应地,nil值用一个特定的对象NSNull来表示NSNull提供了一个单一实例用于表示对象属性中的的nil值。默认的实现方法中,dictionaryWithValuesForKeys:setValuesForKeysWithDictionary:自动地将NSNullnil相互转换,因此您的对象不需要进行NSNull的测试操作。

 

对比:

在Objective-C里,nil对象被设计来跟NULL空指针关联的。他们的区别就是nil是一个对象,而NULL只是一个值。而且我们对于nil调用方法,不会产生crash或者抛出异常。

这个技术被framework通过多种不同的方式使用。最主要的就是我们现在在调用方法之前根本无须去检查这个对象是否是nil。假如我们调了nil对象的一个有返回值的方法,那么我们会得到一个nil返回值。
我们可以通过nil对象让我们的dealloc函数实现看上去更帅一点:
- (void) dealloc
{
self.caption = nil;
self.photographer = nil;
[super dealloc];
}
之所以可以这么做是因为我们给把nil对象设给了一个成员变量,setter就会retain nil对象(当然了这个时候nil对象啥事情也不会做)然后release旧的对象。这个方式来释放对象其实更好,因为这样做的话,成员变量连指向随机数据的机会都没有,而通过别的方式,出现指向随机数据的情形机会不可避免。
注意到我们调用的self.VAR这样的语法,这表示我们正在用setter,而且不会引起任何内存问题。假如我们直接去设值的话,就会有内存溢出:
// incorrect. causes a memory leak.
// use self.caption to go through setter
caption = nil;


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Objective-C: 字符串NSString与NSMutableString发布时间:2022-07-12
下一篇:
【Objective-C】09-空指针和野指针发布时间:2022-07-12
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap