1 objective-c
ios选择objective-c作为开发语言的原因:
- 面向对象
- 兼容标准的C语言
- 语法简单较易学习
1.1 类定义
创建Objective-C类时会生成两个文件:.h
的头文件与.m
的源文件。类声明关键字为@interface
,类实现关键字为@implementation
。
MyClass.h
文件:定义了成员变量和方法。
@interface MyClass:NSObject{ //声明
NSString *result; //字符串
}
-(void) setResult:(NSString *)_result; //setter方法
-(NSString *) result; //getter方法
@end //声明结束
函数前面的"-“号表示这个函数需要创建类实体变量才能调用,同理,函数前面”+"号表示这是一个类函数,无需创建类实体变量,用类名直接调用即可。
1.2 类实现
MyClass.m
文件:补充程序的工作。
@implementation MyClass
-(void) setResult:(NSString *)_result{
result=_result; //设置
}
-(NSString *)result{
return result; //返回
}
@end
@implementation为类实现关键字。在result的实现里把参数传递给成员变量。类结束不要忘记添加@end
关于初始化类实体变量,并调用成员变量的代码如下所示。
MyClass *myClass=[[MyClass alloc] init];//初始化实体变量
[MyClass setResult:@"Hello ios"]; //设置参数值
[MyClass result];
Objective-C调用函数的方式为[类 函数],如果需要传递参数,就在
:
号后面将参数传递过去。@"Hello ios"
是Objective-C中标准字符串格式,如果不加@表示的是C语言的字符串,两者使用需要转换
alloc表示请求一块内存,init是初始化类实体变量。这两个函数都是MyClass父类NSObject的成员函数。
1.3 多参数方法
-(int)ageQueryedByName:(NSString*)name Sex:(BOOL)sex School(NSString*)school;
调用:
[self ageQueryedByName:@"小明" Sex:YES School:@"山东大学"];
1.4 属性
声明方式:
@propery(修饰)类型 名字
@interface MyClass:NSObject{ //声明
NSString *result; //字符串
}
@propery(retain,nonatatomic)NSString *result; //属性
-(void) setResult:(NSString *)_result; //setter方法
-(NSString *) result; //getter方法
@end //声明结束
@propery(retain,nonatatomic)NSString *result;
本行代码表示对变量result进行一次引用计数。
修饰属性使用的关键词分类
- 赋值方法:assign表示直接赋值,这是默认操作。copy表示复制创建一个新的对象
- 读写权限:readwrite表示可读写,readonly表示只读
- 原子操作:nonatomic是非原子修饰符,atomic是原子操作,这是默认的。这类修饰符主要用于多线程运行防止同时操作资源,nonatomic运行效率更高,一般都采用这类方式。
MyClass.m
@implementation MyClass
@synthesize result;
-(void) setResult:(NSString *)_result{
result=_result; //设置
}
-(NSString *)result{
return result; //返回
}
@end
@synthesize result;
表示创建该属性的访问器,这样就可以直接访问result变量。
没加之前
MyClass *myClass=[[MyClass alloc] init];//初始化实体变量
[MyClass setResult:@"Hello ios"]; //设置参数值
[MyClass result];
加之后
MyClass *myClass=[[MyClass alloc] init];//初始化实体变量
myClass.result=@"hello ios"; //设置参数值
注:所有的变量声明,方法声明、属性声明都需要用半角分号(
;
)作为结束。
1.5 类别
类别与类名很相似,有很强的实用性与便捷性。无需创建对象类的子类就能完成添加新的方法的工作。
类别(categrory)是一种为现有的类添加新方法的方式。声明如下:
@interface 类名(类别名)
扩充方法声明
@end
示例:
@interface MyClass(MyCategory)
-(void)newMethod;
@end
类别特点:
- 不能向类中添加新的实例变量;
- 在类别中的方法若与类中现有的方法重名,则类中的方法不可用,被类别中的新方法所取代
- 同名类别有唯一性,但是可以添加任意多的不同名类别。也就是说可以再创建
@interface MyClass(MyCategory1)、@interface MyClass(MyCategory2)...
任意多个类别。
@interface MyClass(MyCategory)
-(void)newMethod{
NSLog(@"new mehtod");
}
@end
NSLog就像c语言的printf,用在console中输出显示结果。NSLog可以格式化输出的形式有字符串、变量和对象等。
用法:
- 直接输出字符串:
NSLog(@"this is a test");
- 输出String is:的代码
NSLog(@"string is :%@",string);
- 输出x=10,y=20的代码如下,其中%@对象为对象格式,%d为整数格式
NSLog(@"x=%d,y=%d),10,20);
2 objective-c的重点部分
2.1 协议
协议(protocol):使用这个协议后便要遵守协议,协议要求实现的方法就一定要实现。协议声明了可以被任何类实现的方法。协议不是那些类本身,他们只是定义了一个接口,其他对象负责去实现。只要实现了协议里面的方法,就叫做符合协议。协议的关键字为
protocol
具体代码:
@protocol MyProtocol //协议声明
-(void) my Proyocol:(NSString *)pra;//协议方法
@end
声明一个协议MyProtocol,拥有一个带参数的函数my Protocol:。具体使用方法如下:
@interface MyClass:NSObject<MyProtocol>{//
NSString *result;
}
@property(retain,nonatomic)NSString *result;
-(void) setResult:(NSString *)_result;
-(NSString *)result;
@end
在@interface MyClass后添加表示MyClass要遵守MyProtocol协议,那么,MyClass就必须要实现MyProtocol的方法。
@implemention MyClass
@synthesize result;
-(void) setResult : (NSString *) _result{
result=_result;
}
-(NSString *) result{
return result;
}
-(void) my Protocol:(NSString *)pra{
NSLog(@"my Protocol parm:%@",pra;
}
@end
注:Objective-c语言没有多重继承概念,不过使用协议可以很好的解决这个问题。
2.3 创建Command Tool工程
- 使用Xcode新建工程
- 为工程命名,并填写部分参数
- 选择储存位置
2.3.1 新建工程
打开Xcode,依次选择File->New ->New Project。
Xcode会让我们为应用程序选择一个模板,模板里包含了快速开发所需要的文件,在窗口左侧选择Mac OS X下的Command Line Tool。
注:Command Line Tool生成的只是一个简单的控制台打印程序。而iPhone程序有专门的模板供开发者选择。
2.3.2 设置工程参数
单击Next按钮,会弹出工程命名窗口,此窗口有两个输入框与一个选择框,(Product Name:输入工程名"TextProtocol")、(Company:公司标识符"com.ios")、(type:选择Foundation)
2.3.3 选择存储位置
选择完工程后,单击Create按钮,工程就建完了。
注:Source Control复选框询问是否开启代码版本控制,默认状态是选中的。
2.4 工程介绍
创建完成后,Xcode会自动打开工程。
Xcode介绍:
- 导航器:导航器位于Xcode左侧,默认显示工程的文件目录,main.m文件里有程序的主函数;Supporting Files文件夹下有一个TestProtocol-Prefix.pch文件,是程序运行时引入的头文件,无需理会;Frameworks文件夹放置了程序的框架,目前只有一个Foundation.framework,我们在这片区域可以管理文件、调试和查看项目的部分信息等。
- 编辑区:Xcode中间部分,会及时展现选中的文件内容,编辑代码就在这里。
- 工作区:Xcode最上方部分,包含很多按钮(Run、Stop)和选择卡,主要用于实现一些实用的辅助功能。
- 属性区:Xcode右侧,里面可以快速查看ing配置文件的属性等等。
2.5 通过程序探究协议与委托
2.5.1 新建类文件
右击TestProyocol文件夹下的任意文件,选择New File命令,弹出选择文件类型界面,右侧选择ios下的Cocoa Touch,文件类型选择Objective-c class。
注:新建的文件会自动排列在选中的文件后面。如果选中某个文件夹,那么文件就会在该文件夹内创建并且排在第一位。
单击Next按钮,弹出文件命名界面,在Class框输入“ClassA”。subclass of是一个下拉框,我们需要为Class选择父类,这里选择NSObject。
单击Next,随后弹出文件路径选择界面,文件路径无需修改。仍然要确保Targets的复选框已经被选中。单击Create按钮即可创建。同时创建ClassB。
2.5.2 设置委托类
将ClassB设置为委托类,ClassA为ClassB的代理。
ClassB.h
#import <Foundataion/Foundataion.h>
@proyocol MyDelegate //协议声明
-(void)fun:(NSString *)_str;
@end
@interface ClassB:NSObject{ //委托类
id<Mydelegate> delegate; //声明一个委托对象
}
@propery(assign,nonatomic) id<Mydelegate> delegate;
-(void)bDoSomething;
@end
ClassB.m
@implementation ClassB
@synthesize delegate;
-(void)bDoSomething{
if(delegate){ //判断是否已经被代理
[delegate fun:@"B do something"];//执行代理方法
}
}
注:Objective-c中引入头文件时采用了
#import
。
2.5.3 实现委托
ClassA.h
#import "ClassB.h"
@interface ClassA : NSObject<Mydelegate>{//实现协议
}
-(void)doSomething; //声明函数
@end
ClassA.m
#import "ClassA.h"
@implementation ClassA
-(void)doSomething{ //函数实现
NSLog(@"ClassA do something");
}
-(void)fun:(NSString *)_str{ //实现委托方法
NSLog(@"A show B do something:%@",_str);
}
main.m
#import "ClassA.h"
#import "ClassB.h"
int main(int argc,const char * argv[]){
@autoreleasepool{
//NSLog(@"hello World!");//注释模板
ClassB *b=[[ClassB alloc] init];//创建ClassB类实例
ClassA *a=[[ClassA alloc] init];//创建ClassA类实例
b.delegate=a; //让a成为b的委托
[b bDoSomething]; //调用函数
}
return 0;
}
运行程序,就会在控制台中打印
A show B do something:B do something
。
2.6 内存管理
Objective-c的内存管理机制很灵活,本质上还是C语言的手动管理方式,还稍微加了一些自动的方法。
2.6.1 引用计数
Objective-C管理对象采用了一种叫做引用计数(retainCount)的机制。每个类对象内部都有一个retainCount的引用计数,它代表着被引用次数,对象刚被创建时,retainCount为1,调用release方法后此属性减一,减到0时dealloc方法被自动调用,系统进行内存回收操作。
例子:
#import "ClassA.h"
#import "ClassB.h"
int main(int argc,const char * argv[]){
@autoreleasepool{
//NSLog(@"hello World!");//注释模板
ClassB *b=[[ClassB alloc] init];//创建ClassB类实例
ClassA *a=[[ClassA alloc] init];//创建ClassA类实例
b.delegate=a; //让a成为b的委托
[b bDoSomething]; //调用函数
[b release]; //释放对象
[a release];
b=nil; //防止出现野指针
a=nil;
}
return 0;
}
2.6.2 自动释放池
autorelease pool(自动释放池):在遵守一些规则的情况下,可以自动释放对象。不过依然无法像.net/java那样完全自动释放掉内存。autorelease pool的类型其实是NSAutoreleasePool,它内部有一个数组,用来保存声明为autorelease的所有对象。如果一个对象声明为autorelease,系统所做的工作就是把这个对象加入到这个数组中。
```ClassA *obj1=[[[ClassA alloc] init] autorease]; //retain count=1`
obj1被加入autorelease pool中,autorelease pool自身在销毁的时候会遍历一边这个数组,release数组中的每个成员。如果此时数组中的成员的reaion count为1,那么release之后retain count为0,对象正式被销毁。如果此时数组成员的release count大于1,那么release之后,retain count大于0;此时对象没有被销毁,内存泄漏。
注:使用autorelease pool可以嵌套。例如:某个主函数创建了一个autorelease pool,然后又调用了创建了autorelease pool实例的其他方法,根据嵌套的机制,最外层pool实力释放后,他的所有内部pool也将释放。
2.6.3 自动引用计数
ARC全称自动引用计数(Automatic Reference Counting)。ARC可以无比强大的为程序分析出对象是如何分配和实现的,然后根据实际情景决定保留对象还是释放对象。这样就可以不去考虑什么时候retain什么时候release。
LLVM编辑器属性:
- strong:作用与retain类似,这种类型的对象在运行时被自动增加引用计数,使用结束后会被自动释放而且指针会被置为nil。
- weak:这是弱引用。
- unsafe_unretained:简单的将一个变量指向到另一个变量,和weak有点类似,也不会增加引用对象的引用计数,不过他是不安全的。
我们可以手动告诉Xcode某个对象需要被释放,只要将其置为nil就可以。
3 ios sdk
SDK(Software Development Kit)全称叫做软件开发工具包。
3.1 组件
一个iPhone SDK包括Xcode、Instruments、Simulator和Interface Builder四个组件。
3.1.1 Xcode
开发iPhone应用程序的工具。
3.1.2 Instruments
此工具可以检测iPhone内存运行情况。
启动:长按Xcode上方的Run按钮,在快捷菜单中选择最后一项Analyze
3.1.3 Simulator
Simulator就是模拟器
3.1.4 Interface Builder
Interface Builder通过图形化的方式让开发者来创建布局程序的界面高效直接。
3.2 核心部分
ios架构可以分为四个大的核心部分,从上到下依次为核心操作系统层(Core OS)、核心服务层(Core Services)、媒体层(Media)和可触摸层(Cocoa Touch)。
3.2.1 Cocoa Touch(可触摸层)
Cocoa Touch层包含了构建程序的基本结构,支持多任务、基于触摸的输入和消息推送等关键技术,以及很多上层系统服务。
3.2.1.1 技术点
- 多任务
- 打印
- 数据保护
- 通知
- 本地通知
- 手势识别
- 文件共享
- 点对点对战服务
- 外部显示支持
3.2.1.2 框架与服务
- Address Book UI框架:显示创建联系人、编辑和选择已有联系人的标准系统界面。
- Event Kit UI框架:用来显示和编辑时间
- Game Kit框架:实现点对点连接和游戏内的语音通话
- iAd框架:广告
- Map Kit框架:可缩放的地图View
- Message UI框架:设置收件人、主题、内容及附件。用户可以选择信息的优先级。选定后,信息就会在用户的房间向里面排队等待发送。
3.2 Media(媒体层)
Media层负责图片、音频和视频等多媒体功能。其中,使用Quartz2D框架处理2D图像,OpenGlES处理3D图像,Core Audio和OpenAL处理音频,Media Player负责视频播放mCore Animation负责动画效果。
3.2.1图像
- Quartz
- Core Animation
- OpenGL ES
3.2.2 音频
- 核心音频
- OpenAL
3.2.3 视频
媒体播放框架:MediaPlayer.framework 可以实现全面屏播放视频,支持视频格式有.mov、.mp4、.m4v和.3gp。
3.3 Core Services(核心服务层)
Core Services包含了Foundation.Framework和Core Foundation.Framework两个框架。
- 电话本:AddressBook.framework。
- 核心基础框架:Core Foundation.Framework
- CFNetwork:通讯
- 核心位置框架:CoreLocation.framework
- 安全框架:Security.framework。
- SQLite
- XML:NSXMLParser解析XML文档元素
3.4 Core OS(核心操作系统层)
位于ios系统的最底层。
框架主要有:
- Accelerate框架:处理复杂的数学或图形计算
- External Accessory框架:与外部通讯
- Security框架:程序所管理的数据安全。