IOSObjectiveC入门教程度最热门要点Word格式.docx
- 文档编号:22717895
- 上传时间:2023-02-05
- 格式:DOCX
- 页数:85
- 大小:1.57MB
IOSObjectiveC入门教程度最热门要点Word格式.docx
《IOSObjectiveC入门教程度最热门要点Word格式.docx》由会员分享,可在线阅读,更多相关《IOSObjectiveC入门教程度最热门要点Word格式.docx(85页珍藏版)》请在冰豆网上搜索。
第3章,类的声明和定义
第4章,继承
第5章,Class类型,选择器Selector以及函数指针
第6章,NSObject的奥秘
第7章,对象的初始化以及实例变量的作用域
第8章,类方法以及私有方法
第9章,内存管理
第10章,到目前为止出现的内存泄漏事件
第11章,字符串,数组以及字典
第12章,属性
第13章,类目(Categories)
第14章,协议(Protocols)
第15章,Delegate
第16章,线程
第17章,文件系统
第18章,数据系列化以及保存用户数据
第19章,网络编程
第20章,XML解析
2,从Hello,World!
现在笔者假设大家已经有了开发的环境。
好了,我们开始构筑我们的第一个程序。
在开始第一个程序之前,笔者需要提醒大家一下,如果手里面有开发环境的话并且是第一次亲密接触Xcode的话,为了可以熟悉开发环境,强烈建议按照笔者的步骤一步一步的操作下去。
2.1,构筑Hello,World
第一步,启动Xcode。
初次启动的时候,也许会弹出一个“WelcometoXcode”的一个对话框。
这个对话框和我们的主题没有关系,我们可以把它关掉。
第二步,选择屏幕上部菜单的“File->
NewProject”,出现了一个让你选择项目种类的对话框。
你需要在对话框的左边选择“CommandLineUtility”,然后在右边选择“FoundationTool”,然后选择“Choose...”按钮。
如图2.1所示。
图2-1,新建项目
注意也许有人会问,你不是要讲解iPhone的开发,那么为什么不选择“iPhoneOS”下面的“Application”呢?
是这样的,在这个系列当中,笔者主要侧重于Objective-C的语法的讲解,为了使得讲解简单易懂,清除掉所有和要讲解的内容无关的东西,所以笔者在这里只是使用最简单的命令行。
第三步,Xcode会提问你项目的名字,在“SaveAs”里面输入“02-HelloWorld”,然后选择“Save”。
如图2-2所示
图2-2,输入项目的名字
第四步,得到一个如图2-3所示的一个画面。
尝试一下用鼠标分别点击左侧窗口栏里面的“02-HelloWorld”,“Source”.“Documentation”,“ExternalFrameworksandLibraries”,“Products”,然后观察一下右边的窗口都出现了什么东西。
一般来说,“02-HelloWorld”就是项目的名字下面是项目所有的文件的列表。
项目下面的子目录分别是和这个项目相关的一些虚拟或者实际上的目录。
为什么我说是虚拟的呢?
大家可以通过Finder打开你的工程文件的目录,你会发现你的所有文件居然都在根目录下,根本就不存在什么“Source”之类的目录。
图2-3,项目浏览窗口
第五步,选择屏幕上方菜单的“Run”然后选择“Console”,出现了如图2-4所示的画面,用鼠标点击窗口中间的“BuildandGo”按钮。
图2-4,运行结果画面
如果不出什么意外的话,大家应该看到我们熟悉得不能再熟悉的“HelloWolrd!
”。
由于我们没有写任何的代码,所以从理论上来说,这部分代码不应该出现编译错误。
好的,从下面开始,笔者要开始对这个HelloWorld里面的一些新鲜的东西进行讲解。
2.2,头文件导入
在Java或者C/C++里面,当我们的程序需要引用外部的类或者方法的时候,需要在程序源文件中包含外部的类以及方法的包(java里面的jarpackage)或者头文件(C/C++的.h),在Objective-C里面也有相类似的机制。
笔者在这一节里面将要向大家介绍在Objective-C里面,头文件是怎样被包含进来的。
请同学们到Xcode开发环境的左侧窗口里面,点击Source文件夹,然后就在右侧部分看到了代码源文件的列表,找到02-HelloWorld.m之后单击会在Xcode的窗口里面出现,双击鼠标代码会在一个新窗口出现,请同学们按照这种方法打开"
02-HelloWorld.m"
。
对于Java程序来说,源程序的后缀为.java,对于C/C++代码来说,后缀为c/cpp,现在我们遇到了.m。
当Xcode看到了.m文件之后,就会把这个文件当作Objective-C文件来编译。
同学们也许会猜到,当Xcode遇到c/cpp,或者java的时候也会对应到相应的语言的。
好的,我们顺便提了一下Xcode对.m文件的约定,现在我们开始从第一行代码讲起,请参看下列代码:
1#import<
Foundation/Foundation.h>
2
3intmain(intargc,constchar*argv[]){
4NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];
5
6//insertcodehere
7NSLog(@"
Hello,World!
"
);
8[pooldrain];
9return0;
10}
11
有过C/C++经验的同学看到第一行,也许会觉得有些亲切;
有过Java经验的同学看到第一行也许也会有一种似曾相识的感觉。
同学们也许猜到了这是干什么用的,没错,这个正是头文件。
不过,在C/C++里面是#include,在java里面是import,这里是#import。
在C/C++里面会有#include互相包含的问题,这个时候需要#ifdef来进行编译的导向,在Xcode里面,同学们可以"
放心的"
包含各种东西,这个没有关系,因为我们的编译器有足够的“聪明”,因为同一个头文件只是被导入一次。
除了#import变得聪明了一点之外,和#include的功能是完全一样的。
我们再来看看我们的另外一个新的朋友---Foundation.h。
这个是系统框架Foundationframework的头文件,有了它你可以免费的获取系统或者说苹果公司为你精心准备的一系列方便你使用的系统功能,比如说字符串操作等等。
Foundation框架从属于Cocoa框架集,Cocoa的另外一个框架为ApplicationKit,或者是UIKit,其中前者的应用对象为MACOS,后者的应用对象为iPhoneOS。
本系列入门指南将只是使用Foundation,因为笔者需要向同学们介绍Objective-C的基本使用方法,为了避免过多的新鲜东西给同学们造成阅读上的困难,所以命令行就已经足够了。
说到这里,笔者需要澄清一点,其实MACOS的Cocoa和iPhone的Cocoa是不一样的,可以说,其中iPhone是MACOS的一个子集。
2.3,main函数
有过C/C++或者java经验的同学们对第3行代码应该很熟悉了,是的大家都一样主程序的入口都是main。
这个main和C/C++语言里面的main是完全一样的,和java语言在本质上也是完全一样的。
因为Objective-C完全的继承了C语言的特性。
确切的说,不是说Objective-C和C语言很相似,而是Objective-C和C语言是完全兼容的。
关于main函数是干什么用的,笔者就不在这里罗嗦了,有兴趣的同学可以找一本C语言的书看看。
2.4,关于NSAutoreleasePool
自己动手,丰衣足食---
在第4行,我们遇到了另外一个新鲜的东西,这就是NSAutoreleasePool。
让我把这个单词分为三部分,NS,Autorelease和Pool。
当我们看到NS的时候,也许不知道是代表着什么东西。
NS其实只是一个前缀,为了避免命名上的冲突。
NS来自于NeXTStep的一个软件,NeXTSoftware的缩写,NeXTSoftware是Cocoa的前身,一开始使用的是NS,为了保持兼容性所以NS一直得以保留。
在多人开发的时候,为了避免命名上的冲突,开发组的成员最好事先定义好各自的前缀。
但是,最好不要有同学使用NS前缀,这样会让其他人产生误解。
略微有些遗憾的是,Objective-C不支持namespace关键字,不知道后续的版本是否会支持。
下面我们讨论一下Autorelease和Pool。
程序在执行的时候,需要向系统申请内存空间的,当内存空间不再被使用的时候,毫无疑问内存需要被释放,否则有限的内存空间会很快被占用光光,后面的程序将无法得到执行的有效内存空间。
从计算机技术诞生以来,无数的程序员,我们的无数先辈都在为管理内存进行努力的工作,发展到现在,管理内存的工作已经得到了非常大的完善。
在Objective-C或者说Cocoa里面,有三种内存的管理方式。
第一种,叫做“GarbageCollection”。
这种方式和java类似,在你的程序的执行过程中,始终有一个高人在背后准确地帮你收拾垃圾,你不用考虑它什么时候开始工作,怎样工作。
你只需要明白,我申请了一段内存空间,当我不再使用从而这段内存成为垃圾的时候,我就彻底的把它忘记掉,反正那个高人会帮我收拾垃圾。
遗憾的是,那个高人需要消耗一定的资源,在携带设备里面,资源是紧俏商品所以iPhone不支持这个功能。
所以“GarbageCollection”不是本入门指南的范围,对“GarbageCollection”内部机制感兴趣的同学可以参考一些其他的资料,不过说老实话“GarbageCollection”不大适合适初学者研究。
第二种,叫做“ReferenceCounted”。
就是说,从一段内存被申请之后,就存在一个变量用于保存这段内存被使用的次数,我们暂时把它称为计数器,当计数器变为0的时候,那么就是释放这段内存的时候。
比如说,当在程序A里面一段内存被成功申请完成之后,那么这个计数器就从0变成1(我们把这个过程叫做alloc),然后程序B也需要使用这个内存,那么计数器就从1变成了2(我们把这个过程叫做retain)。
紧接着程序A不再需要这段内存了,那么程序A就把这个计数器减1(我们把这个过程叫做release);
程序B也不再需要这段内存的时候,那么也把计数器减1(这个过程还是release)。
当系统(也就是Foundation)发现这个计数器变成了0,那么就会调用内存回收程序把这段内存回收(我们把这个过程叫做dealloc)。
顺便提一句,如果没有Foundation,那么维护计数器,释放内存等等工作需要你手工来完成。
这样做,有一个明显的好处就是,当我们不知道是A先不使用这段内存,还是B先不使用这段内存的时候,我们也可以非常简单的控制内存。
否则,当我们在程序A里面释放内存的时候,还需要看看程序B是否还在使用这段内存,否则我们在程序A里面释放了内存之后,可怜的程序B将无法使用这段内存了。
这种方式,尤其是在多线程的程序里面很重要,如果多个线程同时使用某一段内存的时候,安全的控制这些内存成为很多天才的程序员的梦魇。
如果有同学搞过COM的话,那么应该对Release/AddRef很熟悉了,其实Obejctive-C和他们的机制是一样的。
接下来,我需要解释一下Autorelease方式。
上述的alloc->
retain->
release->
dealloc过程看起来比较令人满意,但是有的时候不是很方便,我们代码看起来会比较罗嗦,这个时候就需要Autorelease。
Autorelease的意思是,不是立即把计数器减1而是把这个过程放在线程里面加以维护。
当线程开始的时候,需要通知线程(NSAutoreleasePool),线程结束之后,才把这段内存释放(drain)。
Cocoa把这个维护所有申请的内存的计数器的集合叫做pool,当不再需要pool(水池)的时候就要drain(放水)。
笔者想要说的是,虽然iPhone支持Autorelease但是我们最好不要使用。
因为Autorelease方式从本质上来说是一种延迟释放内存的机制,手机的空间容量有限,我们必须节约内存,确定不需要的内存应该赶快释放掉,否则当你的程序使用很多内存的情况下也许会发生溢出。
这一个习惯最好从刚刚开始学习使用Objective-C的时候就养成,否则长时间使用Autorelease会让你变得“懒散”,万一遇到问题的时候,解决起来会非常耗费时间的。
所以,还是关于内存管理,我们还是自己动手,丰衣足食。
当然笔者不是说绝对不可以使用,而是当使用Autorelease可以明显减低程序复杂度和易读性的时候,还是考虑使用一下换一下口味。
说到这里,可能有的同学已经开始发晕了,认为这个东西比较难以理解。
是的,笔者在这里只是介绍一个大概的东西,在这里只要了解计数器的概念就可以了,笔者将在随后的章节里面对这个功能加以详细论述,请同学们放心,这个东西和HelloWorld一样简单。
关于Pool
在使用Pool的时候,也要记住系统给你的Pool的容量不是无限大的,从这一点来说和在现实世界的信用卡比较相似。
你可以在一定程度透支,但是如果“忘记掉”信用卡的额度的话,会造成很大的系统风险。
第三种,就是传统而又原始的C语言的方式,笔者就不在这里叙述了。
除非你在Objective-C里面使用C代码,否则不要使用C的方式来申请和释放内存,这样会增加程序的复杂度。
线程是什么东西?
线程指的是进程中一个单一顺序的控制流。
它是系统独立调度和分派的基本单位。
同一进程中的多个线程将共享该进程中的全部系统资源,比如文件描述符和信号处理等等。
一个进程可以有很多线程,每个线程并行执行不同的任务。
2.5,关于[[NSAutoreleasePoolalloc]init];
关于程序第4行等号右边出现的括弧以及括弧里面的内容,笔者将在后续的章节里面介绍。
在这里,同学们可以理解为,通过告诉Objective-C编译器[[NSAutoreleasePoolalloc]init],编译器就会成功的编译生成NSAutoreleasePoo对象的代码就可以了。
2.6,Objective-C里面的注释
同学们在第6行看到了//的注释,这个和C++以及Java是一样的,表示这一行的内容是注释,编译器将会忽略这一行的内容。
笔者在上面说过Objective-C完全兼容C语言,所以C语言里面传统的/**/在Objective-C里面也是有效的。
2.7,命令行输出
第7行,我们看到了NSLog这个函数。
NS上面已经讲过了,我们都知道Log是什么意思,那么这段代码的意思就是输出一个字符串,Xcode的代码生成器自己把字符串定义为“Hello,World!
NSLog相当于C语言里面的printf,由于我们是在使用Objective-C所以笔者将会和同学们一起,在这里暂时忘记掉我们过去曾经熟悉的printf。
有眼光锐利的同学会发现在字符串的前面多了一个@符号,这是一个什么东西呢?
如前所述,Objective-C和C是完全兼容的,但是NSLog这个函数需要的参数是NSString,这样就产生了一个问题,如果使用C的字符串方式的话,为了保持和C的兼容性编译器将会把字符串理解为C的字符串。
为了和C的字符串划清界限,在C的字符串前面加上@符号,Objective-C的编译器会认为这是一个NSString,是一个NSLog喜欢的参数。
为什么NSLog或者Cocoa喜欢使用NSString?
因为NSString封装了一系列的字符串的方法比如字符串比较,字符串和数字相互转换等等的方法,使用起来要比C的字符串方便的多。
2.8,本章总结
非常感谢同学们耐心的看到这里!
通过理解本章的内容,同学们应该可以使用Xcode创建一个命令行的工程,理解.m文件的基本要素,理解内存的管理方法的思路,还有Objective-C的注释的写法,以及命令行的输出方法。
是不是很简单又很有乐趣呢?
笔者将会尽最大努力把看起来复杂的东西讲解的简单一些,并且真心的希望大家可以从中找到乐趣。
3,类的声明和定义
本系列讲座有着很强的前后相关性,如果你是第一次阅读本篇文章,为了更好的理解本章内容,笔者建议你最好从本系列讲座的第1章开始阅读,请点击这里。
上一章我们写了一个非常简单的Obejctive-C下面的Hello,World!
的小程序,并且对里面出现的一些新的概念进行了解释。
这一章,我们将要深入到Objective-C的一个基本的要素,也就是类的声明和定义。
通过本章的学习,同学们应该可以定义类,给类加上变量,还有通过方法访问类的变量。
不过准确的说,变量和方法的名词在Objective-C里面并不是最准确的称呼,我们暂时引用Java的定义,稍后我们将统一我们的用语定义。
3.1,本章的程序的执行结果。
我们将构筑一个类,类的名字叫做Cattle,也就是牛的意思,今年是牛年而且我还想给在股市奋战的同学们一个好的名字,所以我们暂时把这个类叫做牛类。
我们在main里面初始化这个牛类,然后调用这个类的方法设定类的变量,最后调用这个类的一个方法,在屏幕上输出,最终输出的结果如下图3-1所示
图3-1,牛类的输出结果
完整的代码在这里。
不过为了熟悉编辑环境以及代码,笔者强烈建议同学们按照下面的步骤自己输入。
3.2,实现步骤
第一步,按照我们在第二章所述的方法,新建一个项目,项目的名字叫做03-HelloClass。
当然,你也可以起一个别的更好听的名字,比如说HelloCattle等等,这个并不妨碍我们的讲解。
如果你是第一次看本系列文章,请到这里参看第二章的内容。
第二步,把鼠标移动到左侧的窗口的“Source”目录,然后单击鼠标右键,选择“Add”,然后界面上会出来一个子菜单,在子菜单里面选择“NewFile...”。
如图3-2所示:
图3-2,新建文件
第三步,在新建文件对话框的左侧选择“CocoaTouchClasses”,然后在右侧窗口选择“NSObjectsubclass”,然后单击“Next”。
如图3-3所示:
第四步,在“NewFile”对话框里面的“FileName”栏内输入“Cattle.m”。
注意,在确省状态下,Xcode为你加上了“.m”的后缀,这个也是编译器识别Objective-C源文件的方法,没有特殊理由请不要修改这个后缀,否则会让编译器感到不舒服。
另外请确认文件名字输入栏的下方有一个“Alsocreate"
Cattel.h"
”选择框,请保持这个选择框为选择的状态。
如图3-4所示。
第5步,在项目浏览器里面选择“Cattle.h”文件,把文件改为如下代码并且保存(Command键+S):
#import<
@interfaceCattle:
NSObject{
intlegsCount;
}
-(void)saySomething;
-(void)setLegsCount:
(int)count;
@end
为什么legsCattle者,牛也;
legs者,股也。
不过牛股里面的牛正确的英文说法应该是Bull,请大家不要着急,我们会在类的继承里面命名一个Bull类的。
第六步,在项目浏览器里面选择“Cattle.m”文件,把文件改为如下代码并且保存(Command键+S):
#import"
Cattle.h"
@implementationCattle
-(void)saySomething
{
NSLog(@"
Hello,Iamacattle,Ihave%dlegs."
legsCount);
(int)count
legsCount=count;
第七步,在项目浏览器里面选择“03-HelloClass.m”文件,把文件改为如下代码并且保存(Command键+S):
intmain(intargc,constchar*argv[]){
NSAutoreleasePool*pool=[[NSAutoreleasePoolalloc]init];
idcattle=[Cattlenew];
[cattlesetLegsCount:
4];
[cattlesaySomething];
[pooldrain];
return0;
第八步,选择屏幕上方菜单里面的“Run”,然后选择“Console”,打开了Console对话框之后,选择对话框上部中央的“BuildandGo”,如果不出什么意外的话,那么应该出现入图3-1所示的结果。
如果出现了什么意外导致错误的话,那么请仔细检查一下你的代码。
如果经过仔细检查发现还是不能执行的话,可以到这里下载笔者为同学们准备的代码。
如果笔者的代码还是不能执行的话,请告知笔者。
3.3,类的声明
从Objective-C名字我们就可以得知,这是一个面向对象的语言。
面向对象的一个最基础的要素就是类的概念,Objective-C也不例外。
所谓的类的概念,其实是从C语言的结构体发展而来的。
我们知道,C语言里面的结构体仅仅有数据的概念,面向对象的语言不仅仅支持数据,还可以在结构体里面封装用于存取结构体数据的方法。
结构体的数据和方法结合,我们把整个结构体称为类(Class)。
仅仅有了类,是不能执行任何操作的,我们必须把类进行实体化,实体化后的类我们称之为对象(Object)。
从这个角度上来说,我们可以认为类是对象的模版。
如果要使用类,那么和构造体相类似,我们必须声明这个类。
请参照“Cattle.h”文件:
3
4@interfaceCattle:
5intlegsCount;
6}
7-(void)saySomething;
8-(void)setLegsCount:
(int
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- IOSObjectiveC 入门教程 热门 要点