创建一个类的时候注意,凡是class method,在返回值前面需要加一个“+”号,
如果是instance method正好相反,在返回值前面加一个“-”号。
在同一个类的声明中,class method 可以跟instance method重名,另外method也可以与某个instance veriable重名,这种情况比较常见,往往用于获取这个instance veriable的值的方法中。
在声明返回值的时候可以用标准C 的语法将返回类型转换成需要的类型,比如
- (float)radius;
另外,如果这个method带有参数,且参数也需要转换类型的话,这往往是有必要的,因为不能保证调用参数的时候传入的参数类型就正好是相符的。比如
- (void)setRadius:(float)aRadius;
注意,在定义method的时候如果不显示的说明返回值或者传入参数的类型,那么缺省的类型就是id,
如果method有一堆参数的话,如此定义。
- makeGroup:group, ...;
- (void)setWidth:(float)width height:(float)height;
2009年3月2日星期一
Class Name的用途
在Objective-C中,Class Name有两种用途,第一是作为类型的说明,用来生成一个此Class的变量的声明。比如
Rectangle *anRect;
另外一种用途是用作Class Object,但是注意,用作Class object的时候一定是要放在一个message expression中,当作一个receiver来用的时候方才可以。比如
if ( [anObject isKindOfClass:[Rectangle class]] )
而不能写成
if ( [anObject isKindOfClass: Rectangle] )
Rectangle *anRect;
另外一种用途是用作Class Object,但是注意,用作Class object的时候一定是要放在一个message expression中,当作一个receiver来用的时候方才可以。比如
if ( [anObject isKindOfClass:[Rectangle class]] )
而不能写成
if ( [anObject isKindOfClass: Rectangle] )
2009年3月1日星期日
metaclass object
之前说到了Class object 它是compiler生成的,没有自己的instance variable,runtime system可以用它来生成instance。
除此之外compiler还会为每个类生成一个metaclass object,它使用来描述class object的,但是它只在内部被runtime system使用,用户是用不到它的。
Class Object的重要的作用就是生成instance,例如如下的代码
id myRect;
myRect = [Rectangle alloc];
这里Rectangle 是一个Class Object ,传给它一个alloc message然后返回的指针就赋给myRect了。便生成了一个instance myRect.
除此之外compiler还会为每个类生成一个metaclass object,它使用来描述class object的,但是它只在内部被runtime system使用,用户是用不到它的。
Class Object的重要的作用就是生成instance,例如如下的代码
id myRect;
myRect = [Rectangle alloc];
这里Rectangle 是一个Class Object ,传给它一个alloc message然后返回的指针就赋给myRect了。便生成了一个instance myRect.
Class Method 和 instance Method
Objective -C 中,编译器将Class 代码编译生成一个Class Object这个,它不能使用instance method, 但它也有自己的继承,就是它可以从父类那里继承来一些class method, 比如version.
举一个例子,
int versionNumber = [Rectangle version];
除了这样你还可以这样
id aClass = [anObject class];
id rectClass = [Rectangle class];
因为Class Object和其他任何object一样都能被定义成id类型,因为他们都是Object,同样的任何Class Object都是属于Class这个类,所以我们同样可以type成Class.
这是两种获知id指针的方式,即可以向一个instance 传一个class消息,也可以向一个class object也就是用Rectangle来代表的这个传一个message消息,都能获知id
Class aClass = [anObject class];
Class rectClass = [Rectangle class];
举一个例子,
int versionNumber = [Rectangle version];
除了这样你还可以这样
id aClass = [anObject class];
id rectClass = [Rectangle class];
因为Class Object和其他任何object一样都能被定义成id类型,因为他们都是Object,同样的任何Class Object都是属于Class这个类,所以我们同样可以type成Class.
这是两种获知id指针的方式,即可以向一个instance 传一个class消息,也可以向一个class object也就是用Rectangle来代表的这个传一个message消息,都能获知id
Class aClass = [anObject class];
Class rectClass = [Rectangle class];
Static typing
Objective-C中如果申明了类,然后定制这个对象的话,叫做static typing. 与其相对的是用id来动态的声明一个对象,将来在使用的时候可以将它弄成任意的类。
static typing的好处很多,但是不能取代dynamic binding 和 dynamic determination of a receiver's class.
任何一种对象,都可以用它所属类的父类来声明,编译的时候没所谓,runtime的时候会找出来它真正属于的类。NSObject中间还有两个方法用于揭示一个对象究竟属于那个类,他们分别是isMemberOfClass 和 isKindOfClass,这两个方法传入的参数都是someClass ,返回值是一个bool值,其中isMemberOfClass 是用以判断这个Object是不是后面那个传入的类的实例,另外一个方法isKindOfClass是用于判断这个Object 是不是后面那个传入类的实例又或者是是它父类的实例。总之是要判断这个Object是否在后面传入这个类的继承树上。
另外Objective-C中的abstract Class 与其他语言的中的规定有所不同,它没有专门标注这种抽象类的说明符号,也并不禁止从抽象类生成实例,但是因为抽象类中的很多方法并没有完成,所以即便是生成了抽象类的实例大多数情况下也没什么用处,不过也有例外,就是NSView这个类,经常被直接的使用,而另外一个经典的例子就是NSObject如果你生成一个这样的实例将什么也做不了。
static typing的好处很多,但是不能取代dynamic binding 和 dynamic determination of a receiver's class.
任何一种对象,都可以用它所属类的父类来声明,编译的时候没所谓,runtime的时候会找出来它真正属于的类。NSObject中间还有两个方法用于揭示一个对象究竟属于那个类,他们分别是isMemberOfClass 和 isKindOfClass,这两个方法传入的参数都是someClass ,返回值是一个bool值,其中isMemberOfClass 是用以判断这个Object是不是后面那个传入的类的实例,另外一个方法isKindOfClass是用于判断这个Object 是不是后面那个传入类的实例又或者是是它父类的实例。总之是要判断这个Object是否在后面传入这个类的继承树上。
另外Objective-C中的abstract Class 与其他语言的中的规定有所不同,它没有专门标注这种抽象类的说明符号,也并不禁止从抽象类生成实例,但是因为抽象类中的很多方法并没有完成,所以即便是生成了抽象类的实例大多数情况下也没什么用处,不过也有例外,就是NSView这个类,经常被直接的使用,而另外一个经典的例子就是NSObject如果你生成一个这样的实例将什么也做不了。
订阅:
评论 (Atom)