OC是一门面向对象的语言,其中自然少不了类。对应C++中的声明和定义,OC的类也分为interface和implementation,并分别以指令
@interface ... @end @implementation ... @end
下面是类Fraction的实例,
Fraction.h头文件:
#import <Foundation/Foundation.h> @interface Fraction : NSObject { int x; } // 成员变量 // 省略 //类方法 +(Fraction*) allocF; +(void) FractionPrint; //实例方法 -(void) Print; -(void) setTo:(int) n over:(int) m; -(double) convertToNum; -(void) add:(Fraction*) f; @end
Fraction.m
#import "Fraction.h" @implementation Fraction +(Fraction*) allocF { return [Fraction alloc]; }
+(void)FractionPrint
{ NSLog(@"This is class function FractionPrint");} -(void)Print { NSLog(@"%i", x); } -(void) setTo:(int) n over:(int)m { NSLog(@"call setTo"); } -(double) convertToNum { NSLog(@"call convertToNum"); return 1; } -(void) add:(Fraction*) f { NSLog(@"call add"); } //存取方法 //暂时省略 @end
上面是OC类的一个实例,对比C++类,有这么几点要注意:
1、OC用函数名称前的+、-号分别表示 类方法 与 实例方法。我们可以简单的对应为C++中的类静态方法与普通成员函数。
同时,对于类方法,对比C++静态函数,OC也有 类似的地方。
(1)OC的类方法只能够访问静态变量或全局变量,而不能够访问类的实例变量。(其原因应该和C++一样,静态方法可以通过类名直接访问,这时候它能访问的仅有静态与全局变量(成员变量要依靠类对象内存空间,所以通过类名直接访问时,成员变量是不存在的)
(2)OC的类方法仅能够通过类名称来调用,而不像C++中静态方法也可以由类对象来调用。
例如对于Fraction类的类方法来说,调用类方法
FractionPrint
#import <Foundation/Foundation.h> #import "ClassTest.h" int main(int argc, const char * argv[]) { @autoreleasepool { Fraction* f = [[Fraction allocF] init]; [Fraction FractionPrint]; // 若使用[f FractionPrint]则提示接口没有该方法<span style="font-family: Arial, Helvetica, sans-serif;"> </span>
} return 0; }
原文地址:http://blog.csdn.net/u013378438/article/details/44131255