黑马程序员—Object c 基础知识
来源:互联网 发布:node forever 编辑:程序博客网 时间:2024/06/07 01:41
文件类型说明:
.h 头文件,用于定义类、实例变量及类中的方法等定义信息(interface)。
.m 源文件,定义方法体,可实现objce-c和c方法(implementation)。
.mm c++源文件
引用头文件:
可通过#import关键字引入想要使用的头文件,该关键字作用通#include相同,不过import会确保每个文件只会被引用一次。
object-c中类的定义有两部分:interface和implementation
interface部分包含类的定义以及实例变量和方法。interfache通常定义在.h(头)文件中;
implementation部分包含方法的实现部分(方法体),implementation通常定义在.m(源)文件中。
@interface MyClass : NSObject{ int count; id data; NSString* name; }-(id)initWithString:(NSString*)aName;+(MyClass*)createMyClassWithString:(NSString*)aName;@end
在上述代码中,包含了以下信息:
名为MyClass的类,继承于Cocoa框架中的NSObject类;
定义了3个成员变量:count、data和name(@protected)
以及声明了2个方法
实例变量也可以放到源文件中定义,如:
// 源文件中的:NSObject为可选,一般情况下不用写@implenmentation MyClass :NSObject{ int count; int data; NSString *name;}-(id)initWithString:(NSString*)aName{ ... }
但需要注意的是,若成员变量定义在源文件中而非头文件中,则变量的访问权限都为@private.
object-c支持强类型和弱类型两种方式定义一个对象变量:
强类型定义时变量类型即类命,且为指针类型
弱类型定义使用id型定义
1 MyClass *myObject; // 强类型定义2 id myObject; //弱类型定义
方法的定义和引用:
Object-C中的方法同其它面向对象语言一样,分两种方法:实例方法(-)和类方法(+)(静态方法)。
实例方法需要通过类的实例去调用,而静态方法可直接通过类名去调用。
1 - (void)insertObject:(id)anObject atIndex:(NSUInter)index;
上述代码中定义了一个名为"insertObject:atIndex"的实例方法,该方法无返回值,并定义了2个形参,类型分别为id和NSUInter。
在定义一个方法时,也可以不指定参数名,如:
1 // 声明一个没有参数名的方法2 -(int) set: (int) n: (int) d;3 4 // 方法调用5 [object set : 4 : 5];
方法的调用:
在Object-C中,调用一个方法叫做发送消息,方法调用语句定义在中括号"[]"中:
1 [myArray insertObject:anObject atIndex:0];
为了避免生成大量的临时变量,Object-C允许嵌套调用方法,使一个方法的返回值当作另一个方法的参数,如:
1 [[myAppObject theArray] inserObject:[myAppObject objectToInsert] atIndex:0];
成员变量:
默认情况下,Object-C中的成员变量为@protected,可通过@public,@private关键字修改成员变量的可见性(只有成员变量拥有这些属性)。
@interface MyObject : NSObject{ // 成员变量要定义在大括号中 @public int n1; @private int n2; @protected int n3;}......@end// 通过类实例访问public的成员变量:MyObject *mo = [[MyObject alloc] init];mo->n1;
若要访问受保护的成员变量,需要在类中定义相应的get和set方法,通过类实例调用这些方法来达到访问或设置这些成员变量的目的。
访问器 :
在Object-C中,提供了@property和@synthesize两个关键字,通过这两个关键字,可以高效的为每个指定的成员变量设定set方法和get方法,称为属性
// 头文件@interface MyObject : NSObject{ @property int n1, n2;}...@end// 源码文件@implementation MyObject@synthesize n1, n2;...@end在上述代码中,Object-C会自动创建4个方法:n1、n2、setN1和setN2。
可通过对象实例直接调用这4个方法
MyObject *mo = [[MyObject alloc] init];int l_n1, l_n2;[mo setN1:4];[mo setN2:8];l_n1 = [mo n1];l_n2 = [mo n2];
Object-C也支持使用"."符号来访问properties
1 mo.n1 = 5;
这种方式同样适用于调用方法
变量范围
Object-C中的变量范围同C一样,在{}中定义的变量属于本地变量,只能在{}中使用,本地变量默认初始化值为nil。同样方法的传值方式是传值引用,但当传递对象时是地址引用。
Object-C中也支持静态变量,通过static关键字,如:
1 static int n = 0;
静态变量默认初始值为0,同C一样。注:静态变量同样只能在定义的范围内使用。
self变量相当于java中的this。
继承
Ojbect-C中的继承同java相同,都是单一继承关系,要继承一个类,可写作:
1 @interface ClassA : NSObject2 3 @end
其中NSObject类是最顶层类,一般所有类的最终父类都是它。
在子类中可以访问父类中的非private变量的实例变量和方法(静态方法和实例方法)。
注:只能访问非private属性的成员变量,说明该变量必须定义在interface中(类的声明中),因为在implementation中声明的成员变量全部都是private。
在子类中通过super访问父类中的方法,如:
1 [super init];
NSObject类常用方法:
方法名说明-(BOOL) isKindOfClass: class-objectIs the object a member of class-object or a descendant? -(BOOL) isMemberOfClass: class-object Is the object a member of class-object? -(BOOL) respondsToSelector: selector Can the object respond to the method specified by selector? +(BOOL) instancesRespondToSelector: selectorCan instances of the specified class respond to selector? +(BOOL)isSubclassOfClass: class-objectIs the object a subclass of the specified class?-(id) performSelector: selector Apply the method specified by selector. (id) performSelector: selector withObject: object Apply the method specified by selector passing the argument object. -(id) performSelector: selector withObject: object1 withObject: object2Apply the method specified by selector with the arguments object1 and object2.
class-object是一个类对象,通过class方法生成,可通过类名和实例名调用class方法生成,如:
[Square class]; // Square 是一个类名[mySquare class]; // mySquare 是一个实例// 验证两个实例是否属于同一个类if ([obj1 class] == [obj2 class]){ ...}// 验证myFan是否属于Fraction,即是否是Fraction的实例[myFan isMemberOfClass: [Fraction class]]
selector是一个SEL类型的变量(C中的函数指针),直接通过@selector生成 ,如:
// 为alloc方法生成一个SEL类型变量@selector (alloc)@selector (setTo:over:)// 查看Fraction类中是否含有setTo:over方法// 该方法也去父类中查找[Fraction instancesRespondToSelector: @selector(setTo:over)];
通过performSelector动态调用函数:
@implementation Fraction-(void) setTO:(int) a Over:(int)b{ ...}-(void) print{ // 通过performSelector方法调用setTo:Over // 传递2个整数参数4和5 [self performSelector:@selector(setTo:Over) withObject:4 withObject:5]}@end
1 if ([graphicObject respondsToSelector: action] == YES)2 [graphicObject performSelector: action]3 else4 // error handling code here
异常
使用@try和@catch捕获异常:
@try{ ...} @catch(NSException *exception){ ...}// 可选的放置一个@finally,该语句无论是否有异常发生,都会执行
编写类的构造函数
可为一个类编写多个不同的初始化函数,实例化类时通过指定不同的初始化函数执行不同的初始化操作
1 -(Fraction *) initWith: (int) n over: (int) d {2 self = [super init];3 if (self)4 [self setTo: n over: d];5 return self;6 }
重写init方法
/* * 注,该方法应该返回id类型, * 而不是指定的类的类型 * 如果其它类继承自该类,初始化子类时候返回的类型就会不正确*/-(id) init{ return [self initWith:0 over:0];}
在类外部定义的变量会成为全局变量,在任何类和方法中(包括其它文件)中都可以访问这个变量。
关键字extern可用来在类和方法内部访问全局变量,同PHP的global类似,但切记:
extern是声明,而不是定义。
在变量前使用extern关键字,并不会为该变量分配内存,仅仅是将该变量标识为全局变量,所以不可以在使用extern定义变量时赋值。
枚举
Object-C支持枚举类型,格式为:
// 定义枚举enum flag { false, true };// 声明两个枚举变量,该枚举变量的值只能是true或falseenum flag endOfData, matchFound;// 定义枚举enum direction { up, down, left = 10, right };// 或enum boolean { no = 0, false = 0, yes = 1, true = 1 };
- 黑马程序员—Object c 基础知识
- 黑马程序员--Object-C 类别
- 黑马程序员--Object- C简介
- 黑马程序员_Objective-C基础知识
- 黑马程序员---C语言基础知识
- 黑马程序员—02初识Object—C
- 黑马程序员——Object-C基础(一)语言简介
- 黑马程序员——Object-C基础(四)方法
- 黑马程序员——Object-C基础(九)内存管理
- 黑马程序员——Object-C基础(十)
- 黑马程序员——IOS学习笔记(Object-c基础)
- 黑马程序员——01-C语言基础知识总结
- 黑马程序员——C语言基础知识(一)
- 黑马程序员——C语言-1:基础知识
- 黑马程序员——Object-C基础(八)Object-C常见特性
- 黑马程序员-Object C之分类
- 黑马程序员-Object-C之构造方法
- 黑马程序员-Object C之block 块
- cursor工作原理一点点说明
- iOS: 在代码中使用Autolayout (2) – intrinsicContentSize和Con
- 在ios应用中,获取uuid,并删除uuid中的-符号
- 关于eclipse工具栏无法找到ADT中AVD,Android Lint等工具图标的解决办法
- Windows系统默认用户句柄与GDI句柄限制
- 黑马程序员—Object c 基础知识
- 入门新手如何系统地学习数据挖掘
- 漫步IOS--数组、sizeof和函数形参
- 不允许创建临时变量,交换两个数的内容
- SAP ABAP编程 在string类型A字符串中查询匹配string类型B字符串
- tuxedo 常见问题总结
- 创建型模式之原型模式(prototype)
- struts2标签学习笔记--转载。
- oracle——DBLINK(数据库间查询)