基础篇:objective-c与iosSDK

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)以及音视频学习路线图等等。

见下方!↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓↓

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值