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](http://xn--ihqx1bi0al77cp4heyg743d.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图像
1.Quartz
2.Core Animation
3.OpenGL ES
3.2.2 音频
1.核心音频
2.OpenAL
3.2.3 视频
媒体播放框架:MediaPlayer.framework 可以实现全面屏播放视频,[支持视频格式有.mov](http://xn--w0ts1g22biwc21b437howv.mov/)、.mp4、.m4v和.3gp。
3.3 Core Services(核心服务层)
Core Services包含了Foundation.Framework和Core Foundation.Framework两个框架。
1.电话本:AddressBook.framework。
2.核心基础框架:Core Foundation.Framework
3.CFNetwork:通讯
4.核心位置框架:CoreLocation.framework
5.安全框架:Security.framework。
6.SQLite
7.XML:NSXMLParser解析XML文档元素
3.4 Core OS(核心操作系统层)
位于ios系统的最底层。
框架主要有:
1.Accelerate框架:处理复杂的数学或图形计算
2.External Accessory框架:与外部通讯
3.Security框架:程序所管理的数据安全。
原文链接:[基础篇:objective-c与iosSDK_objectc 源码 sdk_lessmker的博客-CSDN博客](
★文末名片可以免费领取音视频开发学习资料,内容包括(FFmpeg ,webRTC ,rtmp ,hls ,rtsp ,ffplay ,srs)以及音视频学习路线图等等。
见下方!↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓