真是万事开头难啊,就一个HelloWorld的程序,搞了我好一阵子,有种伤不起的感觉 。HelloWorld的代码已经能看懂了,可问题总出在编译和运行上。一开始用命令行的方式编译运行,会报一些头文件找不到,或是库找不到的错,搞的我无语了。后来我又下载安装了个高级开发工具ClodeBlocks。但还是编译不过。你说就这几行代码的程序,竟然遇到这么多的坎坷。先不管这些了,先把HelloWorld和程序再分析一把吧。
源代码:main.m文件
#import <Foundation/Foundation.h>
int main(int argc,const char * argv[]){
NSLog(@"Hello World!");
return(0);
}
刚开始看这个程序的时候有种看天书的感觉,各种困惑,虽然自己还是有点C基础的,但那又怎样。
没办法,硬着头皮往下看吧。搞程序的能搞到高手的级别的时候我想头皮基本都是铁皮了,因为可能一路上都是硬着头皮走过来的吧。
#import: import翻译过来是导入的意思,它前面加了一个#可能是声明的意思,还记得在C语言中有个#include,它的意思是通知编译器应在头文件
中查询定义。于是我想#import应该是想实现相同的作了吧。
#import是GCC编译器提供的。它可保证在编译器编译程序的时候头文件只包含一次,而不论此命令实际上在那个程序文件中出现过多少次。
Foundation: 是Objective-c中是一个框架,用来处理用户界面之下的层中的特性。这句话解释的有点模糊,看了也白看。现在姑且先解释成
处理用户界面元素的一个技术集合吧。等学到后面了,我想对这个东西应该会有更深刻的理解吧。而在Foundation中有一个主头文件,它包含
了所有框架和各个头文件,通过使用#import,就可以导入主头文件。了解到这,那对于HelloWorld程序中的第一句话算是初始理解了(#import <Foundation/Foundation.h>)
这句话中Foundation.h应该就是Foundation框架中的主头文件吧,这样的话整个语句我现在就理解为导入Foundation框架中的主头文件Foundation.h
int main(int argc,const char * argv[]){}:这是一个主方法,由GCC编译器自动调用。是程序的入口,返回类型为Int,有两个参数,GCC编译器在调用这个主方法的时候应该会给这个方法传入两个参数。第一个参数是Int类型的,第二个参数是一个char指针数组,可以有多个元素。其中发现有个const修饰词,应该说的是数组里的元素应该是常量值吧。
NSLog():这里能认识的只有Log,Log是日志信息的意思,有点像C语言中的Printf(),可以像控制台输出日志信息,但对Log前面的NS一开始是比较困惑的。后来了解到
这是一个历史遗留问题。相当年Cocoa工具包叫做NextSTEP,是NeXTSoftware公司的产品它对其所有的函数,常量和类型名称都添加了NextSTEP的缩写NS前缀,后来苹果公司收购了这家公司,为了程序的兼容性,继续使用NS前缀。当看到这的时候对NSLog()的样子和含意就见怪不怪了。
@"Hello World!":看到@我的联想到的邮箱地址中也有一个@ ,当然后来证明我的联想是无知的。因为@符号是Objective-c在标准C语言基础上添加的一个新特性。双引号中的字符串前加一个@ 这表示引用的字符串应该作为Cocoa的NSString元素来处理。问题又来了,什么是NSString?去掉前面的NS前缀,就可以看到String,String我是知道的,它代表一个字符串类型。到这我就明白了NSString是Cocoa中代表一个字符串类型的类型名。于是@“HelloWorld”其实就是一个NSString类型的字符串。它放到NSLog()中就代表要往控制台输出一个内容为HelloWorld的字符串。至此,HelloWorld程序的代码就全部分析完了。