基础篇:objective 您所在的位置:网站首页 怎么使用xcode 基础篇:objective

基础篇:objective

2023-03-29 08:09| 来源: 网络整理| 查看: 265

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);

【相关学习资料推荐,点击下方链接免费报名,先码住不迷路~】

音视频免费学习地址:FFmpeg/WebRTC/RTMP/NDK/Android音视频流媒体高级开发

【免费分享】音视频学习资料包、大厂面试题、技术视频和学习路线图,资料包括(C/C++,Linux,FFmpeg webRTC rtmp hls rtsp ffplay srs 等等)有需要的可以点击788280672加群免费领取~

2 objective-c的重点部分

2.1 协议

协议(protocol):使用这个协议后便要遵守协议,协议要求实现的方法就一定要实现。协议声明了可以被任何类实现的方法。协议不是那些类本身,他们只是定义了一个接口,其他对象负责去实现。只要实现了协议里面的方法,就叫做符合协议。协议的关键字为protocol

具体代码:

@protocol MyProtocol //协议声明 -(void) my Proyocol:(NSString *)pra;//协议方法 @end

声明一个协议MyProtocol,拥有一个带参数的函数my Protocol:。具体使用方法如下:

@interface MyClass:NSObject{// 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 @proyocol MyDelegate //协议声明 -(void)fun:(NSString *)_str; @end @interface ClassB:NSObject{ //委托类 id delegate; //声明一个委托对象 } @propery(assign,nonatomic) id 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{//实现协议 } -(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图像

1.Quartz

2.Core Animation

3.OpenGL ES

3.2.2 音频

1.核心音频

2.OpenAL

3.2.3 视频

媒体播放框架:MediaPlayer.framework 可以实现全面屏播放视频,支持视频格式有.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博客



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有