您好,欢迎访问三七文档
当前位置:首页 > 财经/贸易 > 资产评估/会计 > Object-c基础知识
Objectc基础知识文件类型说明:.h头文件,用于定义类、实例变量及类中的方法等定义信息(interface)。.m源文件,定义方法体,可实现objce-c和c方法(implementation)。.mmc++源文件引用头文件:可通过#import关键字引入想要使用的头文件,该关键字作用通#include相同,不过import会确保每个文件只会被引用一次。object-c中类的定义有两部分:interface和implementationinterface部分包含类的定义以及实例变量和方法。interfache通常定义在.h(头)文件中;implementation部分包含方法的实现部分(方法体),implementation通常定义在.m(源)文件中。1@interfaceMyClass:NSObject2{3intcount;4iddata;5NSString*name;6}7-(id)initWithString:(NSString*)aName;8+(MyClass*)createMyClassWithString:(NSString*)aName;9@end在上述代码中,包含了以下信息:名为MyClass的类,继承于Cocoa框架中的NSObject类;定义了3个成员变量:count、data和name(@protected)以及声明了2个方法实例变量也可以放到源文件中定义,如:1//源文件中的:NSObject为可选,一般情况下不用写2@implenmentationMyClass:NSObject3{4intcount;5intdata;6NSString*name;7}89-(id)initWithString:(NSString*)aName10{11...12}但需要注意的是,若成员变量定义在源文件中而非头文件中,则变量的访问权限都为@private.object-c支持强类型和弱类型两种方式定义一个对象变量:强类型定义时变量类型即类命,且为指针类型弱类型定义使用id型定义1MyClass*myObject;//强类型定义2idmyObject;//弱类型定义方法的定义和引用:Object-C中的方法同其它面向对象语言一样,分两种方法:实例方法(-)和类方法(+)(静态方法)。实例方法需要通过类的实例去调用,而静态方法可直接通过类名去调用。1-(void)insertObject:(id)anObjectatIndex:(NSUInter)index;上述代码中定义了一个名为insertObject:atIndex的实例方法,该方法无返回值,并定义了2个形参,类型分别为id和NSUInter。在定义一个方法时,也可以不指定参数名,如:1//声明一个没有参数名的方法2-(int)set:(int)n:(int)d;34//方法调用5[objectset:4:5];方法的调用:在Object-C中,调用一个方法叫做发送消息,方法调用语句定义在中括号[]中:1[myArrayinsertObject:anObjectatIndex:0];为了避免生成大量的临时变量,Object-C允许嵌套调用方法,使一个方法的返回值当作另一个方法的参数,如:1[[myAppObjecttheArray]inserObject:[myAppObjectobjectToInsert]atIndex:0];成员变量:默认情况下,Object-C中的成员变量为@protected,可通过@public,@private关键字修改成员变量的可见性(只有成员变量拥有这些属性)。1@interfaceMyObject:NSObject2{3//成员变量要定义在大括号中4@publicintn1;5@privateintn2;6@protectedintn3;7}8......9@end1011//通过类实例访问public的成员变量:12MyObject*mo=[[MyObjectalloc]init];13mo-n1;若要访问受保护的成员变量,需要在类中定义相应的get和set方法,通过类实例调用这些方法来达到访问或设置这些成员变量的目的。访问器:在Object-C中,提供了@property和@synthesize两个关键字,通过这两个关键字,可以高效的为每个指定的成员变量设定set方法和get方法,称为属性1//头文件2@interfaceMyObject:NSObject3{4@propertyintn1,n2;5}6...7@end89//源码文件10@implementationMyObject1112@synthesizen1,n2;13...14@end在上述代码中,Object-C会自动创建4个方法:n1、n2、setN1和setN2。可通过对象实例直接调用这4个方法MyObject*mo=[[MyObjectalloc]init];intl_n1,l_n2;[mosetN1:4];[mosetN2:8];l_n1=[mon1];l_n2=[mon2];Object-C也支持使用.符号来访问properties1mo.n1=5;这种方式同样适用于调用方法变量范围Object-C中的变量范围同C一样,在{}中定义的变量属于本地变量,只能在{}中使用,本地变量默认初始化值为nil。同样方法的传值方式是传值引用,但当传递对象时是地址引用。Object-C中也支持静态变量,通过static关键字,如:1staticintn=0;静态变量默认初始值为0,同C一样。注:静态变量同样只能在定义的范围内使用。self变量相当于java中的this。继承Ojbect-C中的继承同java相同,都是单一继承关系,要继承一个类,可写作:1@interfaceClassA:NSObject23@end其中NSObject类是最顶层类,一般所有类的最终父类都是它。在子类中可以访问父类中的非private变量的实例变量和方法(静态方法和实例方法)。注:只能访问非private属性的成员变量,说明该变量必须定义在interface中(类的声明中),因为在implementation中声明的成员变量全部都是private。在子类中通过super访问父类中的方法,如:1[superinit];NSObject类常用方法:方法名说明-(BOOL)isKindOfClass:class-objectIstheobjectamemberofclass-objectoradescendant?-(BOOL)isMemberOfClass:class-objectIstheobjectamemberofclass-object?-(BOOL)respondsToSelector:selectorCantheobjectrespondtothemethodspecifiedbyselector?+(BOOL)instancesRespondToSelector:selectorCaninstancesofthespecifiedclassrespondtoselector?+(BOOL)isSubclassOfClass:class-objectIstheobjectasubclassofthespecifiedclass?-(id)performSelector:selectorApplythemethodspecifiedbyselector.(id)performSelector:selectorwithObject:objectApplythemethodspecifiedbyselectorpassingtheargumentobject.-(id)performSelector:selectorwithObject:object1withObject:object2Applythemethodspecifiedbyselectorwiththeargumentsobject1andobject2.class-object是一个类对象,通过class方法生成,可通过类名和实例名调用class方法生成,如:1[Squareclass];//Square是一个类名2[mySquareclass];//mySquare是一个实例34//验证两个实例是否属于同一个类5if([obj1class]==[obj2class])6{7...8}910//验证myFan是否属于Fraction,即是否是Fraction的实例11[myFanisMemberOfClass:[Fractionclass]]selector是一个SEL类型的变量(C中的函数指针),直接通过@selector生成,如://为alloc方法生成一个SEL类型变量@selector(alloc)@selector(setTo:over:)//查看Fraction类中是否含有setTo:over方法//该方法也去父类中查找[FractioninstancesRespondToSelector:@selector(setTo:over)];通过performSelector动态调用函数:1@implementationFraction2-(void)setTO:(int)aOver:(int)b3{4...5}6-(void)print7{8//通过performSelector方法调用setTo:Over9//传递2个整数参数4和510[selfperformSelector:@selector(setTo:Over)withObject:4withObject:5]11}12@end1if([graphicObjectrespondsToSelector:action]==YES)2[graphicObjectperformSelector:action]3else4//errorhandlingcodehere异常使用@try和@catch捕获异常:1@try2{3...4}@catch(NSException*exception)5{6...7}8//可选的放置一个@finally,该语句无论是否有异常发生,都会执行编写类的构造函数可为一个类编写多个不同的初始化函数,实例化类时通过指定不同的初始化函数执行不同的初始化操作1-(Fraction*)initWith:(int)nover:(int)d{2self=[superinit];3if(self)4[selfsetTo:nover:d];5returnself;6}重写init方法1/*2*注,该方法应该返回id类型,3*而不是指定的类的类型4*如果其它类继承自该类,初始化子类时候返回的类型就会不正确5*/67-(id)init8{9return[selfinitWith:0over:0];10}在类外部定义的变量会成为全局变量,在任何类和方法中(包括其它文件)中都可以访问这个变量。关键字extern可用来在类和方法内部访问全局变量,同PHP的global类似,但切记:extern是声明,而不是定义。在变量前使用extern关键字,并不会为该变量分配内存,仅仅是将该变量标识为全局变量,所以不可以在使用extern定义变量时赋值。枚举Object-C支持枚举类型,格式为:1//定义枚举2enumflag{false,true};34//声明两个枚举变量,该枚举变量的值只能是true或false5enumflagendOfData,matchFound;67//定义枚举8enumdirection{up,down,left=10,right};910//或11enumboolean{no=0,false=0,yes=1,true=1};
本文标题:Object-c基础知识
链接地址:https://www.777doc.com/doc-2884396 .html