一. SEL 类型
在上一篇介绍了几个方法, 都只是介绍了其使用方式但是没有具体介绍参数:
- - (id)performSelector:(SEL)aSelector;
- - (id)performSelector:(SEL)aSelector withObject:(id)object;
- - (id)performSelector:(SEL)aSelector withObject:(id)object1 withObject:(id)object2;
- - (BOOL)respondsToSelector:(SEL)aSelector;
其中有看到 SEL 类型. SEL 相当于函数指针. 下面介绍 performSelector 方法:
[对象 performSelector:SEL 变量 withObject: 参数 1 withObject: 参数 2];
在调用 respondsToSelector:@selector(method) 时, 这个 method 只有在该方法存在参数时需要 ":", 如果该方法不需要参数就不需要加这个冒号. 否则, 编译不会报错, 只是执行返回的值不对. 当然如果方法有多个参数, 需要多个冒号, 参数有名称的需要带上参数名称.
二. @selector
@selector 其实就是选择器, 使用 @selector 放回 SELleixing, 所以 SEL 和 @selector 一般都是同时使用的.
SEL sel=@selector(write:andAge:);
@selector 方法用法如上, 但是这里要注意一下如果方法有输入参数则需要使用: , 如果没有参数则不要:
SEL sel1=@selector(eat);
如果使用可以参考上一章所述内容.
三. Class
先看看 Class 类型的代码如下:
- typedef struct objc_class *Class;
- typedef struct objc_object {
- Class isa;
- } *id;
从上面的代码可以看到 Class 是结构类型, 可以使用如下方式获取一个对象的 Class
Class c=[Person class];
四. @class
由于头文件的相互包含及依赖关系, 往往很小的改动就需要重新编译很多的文件. Object-C 提供了一种方法可以减少由于依赖引起的重新编译:@class 来告诉编译器这是一个类, 编译器只需要通过指针来引用它即可, 并不需要知道关于这个类的更多信息. 以此来减少编译工作.
- #import <Foundation/Foundation.h>
- @class Person;
- @interface Student : NSObject{
- Person *p;
- }
- @end
通过以上代码可以看到,@class Person . 然后我们在 Student 类中就可以直接引用 Person 这个类了. 在以往的时候需要使用
#import "Person.h" 才可以. 我们使用 @class 替换之前的这种方式.
来源: http://www.bubuko.com/infodetail-2879016.html