基础篇:objective-c与iosSDK

1 objective-c

ios选择objective-c作为开发语言的原因:

  1. 面向对象
  2. 兼容标准的C语言
  3. 语法简单较易学习

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进行一次引用计数。
修饰属性使用的关键词分类

  1. 赋值方法:assign表示直接赋值,这是默认操作。copy表示复制创建一个新的对象
  2. 读写权限:readwrite表示可读写,readonly表示只读
  3. 原子操作: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

类别特点:

  1. 不能向类中添加新的实例变量;
  2. 在类别中的方法若与类中现有的方法重名,则类中的方法不可用,被类别中的新方法所取代
  3. 同名类别有唯一性,但是可以添加任意多的不同名类别。也就是说可以再创建@interface MyClass(MyCategory1)、@interface MyClass(MyCategory2)...任意多个类别。
@interface MyClass(MyCategory)
-(void)newMethod{
	NSLog(@"new mehtod");
}
@end

NSLog就像c语言的printf,用在console中输出显示结果。NSLog可以格式化输出的形式有字符串、变量和对象等。

用法:

  1. 直接输出字符串:NSLog(@"this is a test");
  2. 输出String is:的代码 NSLog(@"string is :%@",string);
  3. 输出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工程

  1. 使用Xcode新建工程
  2. 为工程命名,并填写部分参数
  3. 选择储存位置

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介绍:

  1. 导航器:导航器位于Xcode左侧,默认显示工程的文件目录,main.m文件里有程序的主函数;Supporting Files文件夹下有一个TestProtocol-Prefix.pch文件,是程序运行时引入的头文件,无需理会;Frameworks文件夹放置了程序的框架,目前只有一个Foundation.framework,我们在这片区域可以管理文件、调试和查看项目的部分信息等。
  2. 编辑区:Xcode中间部分,会及时展现选中的文件内容,编辑代码就在这里。
  3. 工作区:Xcode最上方部分,包含很多按钮(Run、Stop)和选择卡,主要用于实现一些实用的辅助功能。
  4. 属性区: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编辑器属性:

  1. strong:作用与retain类似,这种类型的对象在运行时被自动增加引用计数,使用结束后会被自动释放而且指针会被置为nil。
  2. weak:这是弱引用。
  3. 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 技术点
  1. 多任务
  2. 打印
  3. 数据保护
  4. 通知
  5. 本地通知
  6. 手势识别
  7. 文件共享
  8. 点对点对战服务
  9. 外部显示支持
3.2.1.2 框架与服务
  1. Address Book UI框架:显示创建联系人、编辑和选择已有联系人的标准系统界面。
  2. Event Kit UI框架:用来显示和编辑时间
  3. Game Kit框架:实现点对点连接和游戏内的语音通话
  4. iAd框架:广告
  5. Map Kit框架:可缩放的地图View
  6. 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框架:程序所管理的数据安全。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值