




已阅读5页,还剩9页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
Objective-C1. Objective-C简介Objective-C是扩充C的面向对象编程语言,在原始C语言主体上加入面向对象的特性,是C语言的严格母集合。其意指任何原始的C语言程式都可以通过Objective-C编译器而不需修改。故本文档假设读者了解或使用过C语言(因为学习时间有限可能有诸多错误,敬请斧正)。1.1. 文件结构Objective-C与C语言类似都是一个后缀为.h的头文件对应一个后缀名为.m实现文件。1.2. 注释与C语言一样都采用/ 和/* */对进行注释。1.3. 预处理C语言的宏定义依旧有效头文件引入则改用#import2. 基本类型和变量2.1. C语言基本类型C语言基本类型在Objective-C中均可使用,其基本类型包括:1. 整型int 4位2. 字符型char 1位3. 浮点型float 4位4. 算精度浮点型double 8位5. 布尔型bool 1位采用C风格的格式化输出,long, short, unsigned等限定符依旧有效。2.2. Objective-C语言扩充类型1. id类型:类似于void*指针可以用来指向任何对象,也可以认为是NSObject类型。2. BOOL:类似于布尔型,使用YES(1),NO(0)来表示true,false。3. NSInteger:设备无关的int类型。4. NSNumber:数据类型对象,基础类型均不是对象,在要使用对象的地方转成NSNumber类型使用如下方法:+ (NSNumber *) numberWithChar: (char) value;+ (NSNumber *) numberWithInt: (int) value;+ (NSNumber *) numberWithFloat: (float) value;+ (NSNumber *) numberWithBool: (BOOL) value;将NSNumber对象转成基础类型对象则使用如下方法- (char) charValue;- (int) intValue;- (float) floatValue;- (BOOL) boolValue;- (NSString *) stringValue;5. SEL(selector):选择器类型,类似函数指针,不过相对于函数指针有很大的运行时动态特性。使用方式如下:SEL 变量名 = selector(方法名字); SEL 变量名 = NSSelectorFromString(方法名字的字符串);NSString *变量名 = NSStringFromSelector(SEL参数);对象名performSelector: SEL对象withObject:方法所属的对象;从使用方式上可以看出SEL类型是用来表示方法的对象,可以通过一个字符串直接找到方法(类似查表),由此提供了很大的运行时特性。6. nil:类似于null,提供了运行时容错,也就是说对nil对象发送消息不会造成程序崩溃。7. block:与其他变量类型一样不过对象保存的是代码块,比SEL类型跟接近于回调函数。使用时也与回调函数一样可以传入参数,同时还可以对定义block对象的变量进行捕获(其实就是直接使用blcok定义出作用域的变量),使用方式如下:int result = myBlock(4);2.3. 变量Objective-C的变量定义与C语言一样都采用类型名后跟变量名的形式如:Int I = 0;Int为类型名, i为变量名 由=赋值为0;对于类的实例变量则用以下形式声明和定义:MyClass *name; /声明MyClass *name = MyClass Alloc init; /定义类对象的所有实例均采用指针的形式进行操作,由Alloc消息为对象分配内存,必须调用init函数之后变量才能使用。变量作用域与C+语言的作用域规则一致。3. 容器类型3.1. NSArray和NSMutableArrayNSArray认为是不可变数组而NSMutableArray则相对应的认为是可变数组。在需要使用顺序容器的地方使用这两种类型,NSMutableArray包含并扩展了NSArray的接口。NSArray常用接口:array count : 数组的长度。array objectAtIndex 0: 传入数组脚标的id 得到数据对象。arrayWithObjects; . :向数组对象初始化赋值。这里可以写任意对象的指针,结尾必须使用nil。NSMutableArray常用接口:array addObject:. : 向可变数组尾部添加数据对象。array addObjectsFromArray:. :向可变数组尾部添加一个数组对象。array removeObject:(id) :删除数组中指定元素,根据对象isEqual消息判断。array removeObjectIdenticalTo:(id) : 删除数组中指定元素,根据对象的地址判断array removeObjectIdenticalTo:(id) inRange:(NSRange) : 在指定范围内删除指定的元素。array removeObjectAtIndex:(NSUInteger):删除数组中指定脚标索引的数据。array removeObjectsInArray:(NSArray *) :删除一个数组的元素。3.2. NSSet和NSMutableSetNSSet认为是不可变集合而NSMutableSet则相对应的认为是可变集合。在需要使用乱序并且不可重复容器的地方使用这两种类型,内部可能使用哈希表实现,提供常数时间查找的特性。NSMutableSet包含并扩展了NSSet的接口。NSSet常用接口:NSSet setWithSet:(NSSet *)set; 用另外一个set对象构造NSSet setWithArray:(NSArray *)array;用数组构造NSSet setWithObjects:.:创建集合对象,并且初始化集合中的数值,结尾必需使用nil。set count ; 得到这个结合对象的长度。set containsObject:.: 判断这个集合中是否存在传入的对象,返回Bool值。set isEqualToSet:objset:判断两个集合是否完全相等,返回Bool值。set isSubsetOfSet:objset:判断集合中的所有数据是否都相等与objeset集合中,返回Bool值。NSMutableSet常用接口:NSMutableSet setWithCapacity:6:创建可变集合对象,并且初始化长度为6。set addObject: obj : 向集合中动态的添加对象。set removeObject:obj:删除集合中的一个对象。set removeAllObjects:删除集合中的所有对象。set unionSet:obj:向集合中添加一个obj集合的所有数据。set minusSet:obj:向集合中删除一个obj集合的所有数据。set intersectSet:向集合中删除一个不包含obj集合的所有数据。3.3. NSDictionary和NSMutableDictionaryNSDictionary认为是不可变键值对集合而NSMutableDictionary则相对应的认为是可变键值对的集合。在需要使用键值对容器的地方使用这两种类型。NSMutableDictionary包含并扩展了NSDictionary的接口。NSDictionary常用接口:NSDictionary dictionaryWithObjectsAndKeys:. : 使用键值对直接创建词典对象,结尾必需使用nil标志结束。dictionary count: 得到词典的键值对数量。dictionary objectForKey:key: 通过传入key对象可以拿到当前key对应储存的值。NSMutableDictionary常用接口:dictionary setObject: forKey: :向可变的词典动态的添加数据dictionary removeAllObjects. : 删除掉词典中的所有数据。dictionary removeObjectForKey. :删除掉词典中指定key的数据3.4. NSString和NSMutableStringNSString认为是不可变字符串数组,而NSMutableString则相对应的认为是可变字符串数组。可以像使用NSArray和NSMutableArray一样使用它们。Objective-C的字符串使用”的形式定义。3.5. NSEnumerator迭代器对于容器类型而言,遍历容器或取得容器中某一对象的值可以使用迭代器来完成常使用如下代码:NSEnumerator *enumeratorObject=容器对象objectEnumerator;for(NSObject *objectinenumeratorObject)/do something与其他语言提供的容器一样一旦添加或删除容器中的元素都会造成迭代器失效。4. 语句和表达式4.1. 顺序结构Objective-C的语句与C语言一样按照书写顺序顺序执行,遇到函数或方法时转入该函数或方法继续顺序执行。每个语言都以;结尾,代码块用包裹。4.2. 分支结构Objective-C的分支语句与C语言的分支结构一样,都使用ifelse,ifelse if,switchcase结构没有任何区别。条件运算符也使用?. : 进行运算。4.3. 循环结构Objective-C的分支语句与C语言的循环结构一样,使用for(; ; ;), while和dowhile语句进行循环语句的执行,continue和break语句也具有同样的作用。对于for循环增加了一种for(对象in容器)的形式实现快速枚举。5. 函数或方法5.1. 方法声明和定义方法的声明在类声明的interface end对之间完成其形式为: 方法修饰符+(返回类型)+方法标签 + :+(参数类型)+ 参数名+ 方法标签 + :+(参数类型)+ 参数名 + 以如下函数为例:-(void)insertObject:(id)anObject atIndex:(NSInteger)index其中 为方法修饰符表明此方法时类方法(类似静态函数 使用符号+)或者实例方法(成员函数使用符号-)。insertObject: 和 atIndex:为方法标签在需要使用方法名的地方将其连起来表示方法民。 id 与 NSInteger 分别是两个参数 anObject 和 index的类型,方法标签:后的括号内为参数类型 并在其后直接加参数名(声明时非必须)。声明到此结束以;结尾,而定义则加上对并在其内添加实现代码,使用return 返回值。5.2. 函数调用Objective-C可以使用使用函数名(参数)的方式调用C函数。5.3. 发送消息对于Objective-C中实现的方法采用对象 方法标签:参数 方法标签:参数的形式进入方法体执行,这个过程称为向对象发送消息。与其他语言不同Objective-C作为C语言的超集,来实现面向对象。可以想象若要对C语言实现面向对象的思想,在调用某种类型的方法或者成员函数的时候需要将对象自身的指针传入到函数中,再根据对象指针访问或者修改对象的成员变量。故Objective-C采用了这样一种类似的方式实现方法调用(据说其调用机制跟这里说的完全不一样,未能深入研究)。对于类方法的调用则是向类名发送消息使用 类名 方法标签:参数 方法标签:参数;6. 类和对象实例6.1. 类声明通常情况下类的声明在.h中,以如下形式声明:interface 类名 : 父类名end类所声明的所有内容均包含在interface end之间6.2. 类实现与类的声明对应的类的实现通放在.m文件中,以如下方式实现:implementation 与声明中相同的类名end类所有声明的实现均包含在implementationend之间6.3. 成员变量类的成员变量的与类声明一同声明,在类型声明之后的对中完成,如:interface 类名 : 父类名Int I; /声明了一个int型的变量iend类成员变量需要再init方法中完成初始化。6.4. 属性Objective-C在原则生不允许直接访问类的成员变量,为了避免重复编写get,set方法,Objective-C提供了一种名为属性的访问方式,编译器会为声明为属性的变量自动生成get,set方法,同时编程人员还可以在类的实现中覆盖这两个方法。使用方式如下:在类声明的interface end 加入property (限定符) classname *name;在类实现的implementationend加入synthesize name;编译器会自动添加如下两个get,set方法:-(void)setName:(classname *)nname = n;-( classname*) nameReturn name;属性的限定符,主要有以下几种其用途也可由字面理解nonatomic 非线程安全strong强类型参与自动计数weak弱类型不参与自动计数copy拷贝类型对对象的赋值将会生成一个副本的形式保存readwrite可读可写编译器自动生成get,set方法readonly只读属性编译器只生成get方法不生成set方法6.5. 类的方法声明与实现类的方法声明也需包含在类声明的interface end对之间,其实现也必须包含在implementationend对之间。7. 面向对象7.1. 继承与其他面向对象语言一样Objective-C的子类继承了父类的所有方法和属性。同时Objective-C语言提供了self和super两个隐式指正用来访问对象自身与直接父类。7.2. 封装Objective-C对数据进行了严格的封装,对数据的访问只能通过方法进行,即使使用点操作符(对象.属性)来访问数据也是通过方法来进行,所有类型的公开方法都在头文件中进行了声明。7.3. 多态Objective-C对无法对方法进行重载,以 方法标签:+方法标签:+ 作为方法名,同个类中不可以重复定义相同的方法,即使参数类型不同也不可以 (分类中可以重载,不过这种方式重载是很烂的编程方式) !Objective-C子类可以对父类的方法进行重写,在运行时会自动调用实例的实际类型对应的方法。7.4. 分类(Category)在需要对类的方法进行扩充,而不想使用继承的方法进行实现(可能系统中已经包含非常多的类)。此时可以使用分类的方式对类的方法进行扩充。分类的声明与定义和类的声明与定义一样,只是在类名之后增加一个括号里边包含了分类名称如下:interface 类名(分类名)endimplementation类名(分类名)end在使用类对象的地方就可以正常的访问分类中扩展的方法。7.5. 动态识别、动态创建和永续生存Objective-C作为面向对象语言提供动态识别特性使用如下方法进行动态识别(对于SEL和协议的动态识别都有相对应的方法):-(BOOL) isKindOfClass: classObj判断是否是这个类或者这个类的子类的实例-(BOOL) isMemberOfClass: classObj 判断是否是这个类的实例Objective-C在动态识别的基础上同时提供了动态创建的特性,主要通过以下方法实现:-( NSString *) NSStringFromClass: (Class *) 获取类名字符串-(Class *) NSClassFromString : (NSString *) 由字符串获取类名有了动态识别和动态创建的基础实现永续生存则只需要再程序初始化时将动态创建相应类型并使用文件中的数据赋值,在合适的时候保持入文件中就可以了(固化)遵守NSCoding协议:protocol NSCoding- (void)encodeWithCoder:(NSCoder *)aCoder;/序列化数据,保存到acoder中- (id)initWithCoder:(NSCoder *)aDecoder;/从aDecoder读取数据,保存到对应的变量中,反序列化数据end8. 协议和委托8.1. 协议Objective-C中的协议类似于接口的概念。声明协议的方式如下:protocol 协议名称 /协议的方法名称 end一个类若遵守某个协议(实现接口方法)则需要再类声明的中添加协议名称然后再实现中实现接口方法8.2. 委托顾名思义委托是将某一事件的处理交由其他对象处理。可以通过回调,保存具体处理对象的指针等方式实现委托。8.3. 用协议实现委托实际开发过程中为实现降低耦合度的目的,经常使用协议实现委托。既在对象中保存一个实现了接口的指针(形如id 委托对象 的形式)在需要执行委托执行时,调用该指针的某个协议方法处理。9. 异常处理Objectiv
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 八中自主招生考试题及答案
- 解析卷公务员考试《常识》同步练习试题(含答案及解析)
- 护理查对制度试题(含答案)
- 贵州企业招聘:2025贵州黔晨综合发展有限公司招聘15人考前自测高频考点模拟试题及完整答案详解1套
- 2025年在线职业技能认证平台投资风险评估分析报告
- 2025年文化娱乐产业产业链重构与协同发展报告
- 2025年婴幼儿配方食品营养配方研究进展与挑战分析报告
- 2025年城市慢行系统建设与城市交通拥堵治理创新策略可行性研究报告
- 2025年教育行业质量评估与认证体系在学校特色教育中的应用报告
- 2025年海洋生态修复政策与海洋生物保护研究报告
- 4.《花之歌》教学设计-2024-2025学年统编版语文六年级上册
- 2025国投生物制造创新研究院有限公司招聘(31人)考试备考试题及答案解析
- 新学期,新征程+课件-2025-2026学年高二上学期开学第一课主题班会
- 2025新版企业员工劳动合同范本
- 医院信息化建设中长期规划(十五五规划2025年)
- 国家中医药管理局《中医药事业发展“十五五”规划》全文
- 阿尔茨海默病及其他类型痴呆临床路径表单
- 公开课第一课素描基础入门课件
- 数据结构ppt课件完整版
- GB∕T 36527-2018 洁净室及相关受控环境 节能指南
- 应用语言学(全套课件197P)
评论
0/150
提交评论