转自:
http://hi.baidu.com/%B0%AE%C9%FA%BB%EE%B0%AEqt/blog/item/55dbddda74f2e72432fa1cd6.html/cmtid/e14ac7392cc199e514cecb3c
Null Values
These macros define null values for classes and instances.
#define nil __DARWIN_NULL #define Nil __DARWIN_NULL
Constants
-
Defines the
id
of a null instance.Available in Mac OS X v10.0 and later.
Declared in
MacTypes.h
. -
Defines the
id
of a null class.Available in Mac OS X v10.0 through Mac OS X v10.4.
Declared in
NSObjCRuntime.h
.
nil
Nil
Declared In
objc.h
在网上查找ruxia如下:
调用nil对象的方法(Calling Methods on Nil)
在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;