1、objective-c中对象的指针与非指针有什么区别?如指针调用是:[id message],那么非指针怎么调用?
2、对多个参数的声明和使用还不是很清楚
3、几个特殊对象
id:object的指针,可表示一切对象的指针
nil:空指针,调用空指针不会有任何效果,也不会导致异常
self:相当于this指针
super:指向父类
self与super的区别:self指向真正的对象,有内存空间,可以作为参数被调用。但super不是一个真正的对象
4、SEL
message通常被认为是一个seelctor 或者 message selector。而SEL则用来表示一个selector。
如aObject有一个方法aMessage,则可以如下定义:
SEL aSelector = @selector(aMassage)
或者: SEL aSelector = @selector(aMessage:) //如果aMessage有参数,那么后面就要带冒号,这两个aSelector是不一样的
SEL使message能动态地在消息表达式中使用,NSObject定义了以下接口:
(id) performSelector: (SEL)aSelector
以下两种方式效果一样:
[aObject aMessage]
[aObject performSelector: @selector (aMessage)] //但这种使用方式没有什么增益,一般不这么用
performSelector的用处在于能够动态调用不同的message:
BOOL isHighlightDraw = ...
SEL shapeDrawingSelector;
if ( isHighlightDraw )
{
shapeDrawingSelector = @selector( drawHighlighted );
}
else
{
shapeDrawingSelector = @selector( draw );
}
...
Shape *aShape = ...
[aShape performSelector: shapeDrawingSelector];
5、respondsToSelector:判断一个对象是否能够响应一个message
id anObject = ... // object that conforms to a protocol
SEL optionalSelector = @selector( optionalMethod );
if ( [anObject respondsToSelector: optionalSelector] ) //通过判断,避免调用anObject无法响应的消息,造成崩溃
{
[anObject optionalMethod];
}
6、objective-c中使用函数调用方式:IMP,相当于一个函数指针,可以像C语言一样采用函数调用的方式(function call)
7、引用计数
10 - (void) setGreetingText: (NSString*) newText
11 {
12 [newText retain]; //引用加+,防止newText被释放
13 [greetingText release]; //引用-1,
14 greetingText = newText;
15 }
当对象创建时,计数初始化为1。当计数为0时,在内存回收前会调用对象的dealloc()方法。因此可以重写该方法,在里面release对象用到的实例变量,防止内存泄露。
记得重写dealloc()方法时,在方法的最后一定要调用[ super dealloc],否则无法调用父类的dealloc,导致父类中定义的变量产生泄露