Objective-C 入门
-
无C、C++等语言基础,约3年JavaEE开发经验,期间接触过Android
-
穷!~用的是黑苹果,有这个意向的朋友,强烈推荐(远景MacIdea),多爬楼,多搜索
-
Objective-C几个学习网站推荐:51CTO、CocoaChina、苹果官网开发者中心(如果你英语OK的话)
在我的建议里,想搞iOS开发,先从学习Objective-C开始,别急着直接写App,即使你有多年其他语言的开发经验。当然,你可以先打开xcode建立个iPhone/iPad Project先体验一下。
之所以不建议直接写App,是因为怕在打开应用代码的时候会傻了眼,这货都是些什么东西啊?
// 方法声明 -(BOOL) method:(NSString *) first secondOut:(BOOL)secondIn; // 方法调用 BOOL flag = [obj method: @"the first one" secondOut: YES];
语法有点怪,跟我们常见的Java, C#这些差的有点远,所以,我们要先从语法下手,一步一步来,就好像刚开始接触JAVA、C#,大部分都是从控制台程序控制台程序开始的,不可能一开始就是JSP、Swing、.NET Winforms。
首先,对于什么是关键字、方法、对象等基础的东西,这里就不多说了,用到一个较为特殊关键字说一个!
我们先将Objective-C里面的方法声明以及调用与Java中的对比一下,或许就可以一目了然了
这图好像有点乱了~~
一步一步来理解下上面几句
首先,方法返回值前面的一个"-",在java的那段代码里面我之所以没写访问修饰符,是怕误解了(一开始的理解就是"-"代表private,"+"代表public),在Objective-C里面,"-"代表的是实例方法,可以当成是JAVA,C#里面需要new对象来调用的方法,"+"代表的是类方法,即JAVA,C#里面的static修饰的静态方法。
其次,方法的返回值为BOOL,这个好理解,BOOL在Objective-C中的取值并不是true/false而是YES/NO(实际其底层值为0/1,这里我们暂时不做研究),方法的返回值类型都用括号括住(BOOL)
方法名method:secondOut:,这名字有点怪,在运行期系统里面这个方法真实的名字叫method:secondOut:,我们可以不用管他这个,就当作这个方法名是method,注意以下的情况就是了
// 无参数的情况,方法名称后面并无":" -(void) method; // 带参数的情况,方法后面出现了":" -(void) method:(BOOL)flag;
第一个参数,类型为NSString*,用法同返回值,都需要用括号"(NSString *)",“*”有C,C++基础或了解过C基本理论的应该都知道,代表的是指针,在Objective-C里面所有的对象变量都是指针类型的(指针这一块,如果有时间最好学习下,目前暂时的理解,可以就把他当作是JAVA/C#中的引用类型,其实意思也是差不多,是记录的一个内存地址)。参数名就不解释了
第二个参数,令人费解的一个格式secondOut:(BOOL) secondIn,可能不管是之前开发C/C++/JAVA/C#的人看到这样写,都无法理解。我这样命名,也是方便于我以下的解释,首先,这个out/in,不要误解为类似C#里面那个out/ref等关键字,应该理解成外部参数名/内部参数名,即意思是说这个参数是BOOL类型的,他的内部参数名是secondIn,外部参数名是secondOut,顾名思义,外部参数名即是在外部使用的(即方法调用的时候),内部参数名是在内部使用的,对于Objective-C的第一个参数是没有外部名称的,第二个参数开始均可以加上外部名称,当然,这个外部名称也可以不写,但是并不是很推荐这样的做法,如下:
// 方法不写外部名称 -(void) method:(BOOL)flag :(int)value; // 更多更参数情况,每个参数用空格隔开 -(void) method:(BOOL)flag outName:(NSString*)name outVal:(int)val;
方法的调用,对象的实例化这里暂时先不说,在Objective-C里面,方法的调用都是用" [ ] ",如上面所写到的 [实例对象 方法名],中间空格隔开,如果方法带有参数,则是方法名:紧接的是第一个参数的值,对于第二、三...后面更多的参数,在方法定义时候的外部参数名称就排得上用场了,写法 参数2外部名称:参数2值 参数3外部名称:参数3值,多个参数由空格隔开
// 有参数调用 [obj method:@"the first one" flag:YES]; // 无参数调用 [obj method];
最后简要解释一下上面提到的".h"文件、NSString、@"string"
一下为一段"Header.h"文件的代码
#import <Foundation/Foundation.h> @interface Header: NSObject { int value; } - (void) method; // 类似于JAVA中的getter方法 - (int) value; // 类似于JAVA中的setter方法 - (void) setValue:(int)val; @end
对应的实现文件"Header.m"
#import "Header.h" @implementation Header - (void) method { // code here... } // 这里有一个需要注意的是参数名不能与实例变量名相同(具体原因这里暂不做研究)
- (void) setvalue:(int)val { value = val } - (int) value { return value; } @end
记事本写的,大概这样,也不知道语法哪里有没有写错...
在Objective-C中,可以看作这两个文件是成对出现了,可以把".h"文件当作是JAVA/C#这些的接口文件,".m"则为实现类文件。以 @interface 开头以 @end 介绍,所继承的NSObject可以当作是JAVA/C#中的Object,只是Objective-C进行了扩展而已(扩展C中的Object),头文件中实例变量放置于 "{ }"之间,方法即放置于@interface 与 @end之间即刻,实现类,#import ".h" 文件,类似与JAVA import/C# using,但是Objective-C中没有包/命名空间这么一说,实现类以 @implementation 开头以 @end 结束,内部则为实现".h"中定义的方法
NSString同上面提到的NSObject一个意思,是Objective-C扩展C的string过后的一个字符串对象
@"string"即可以理解成将字符串转换为NSString对象,因为写成 NSString *str = "this is content";是编译不通过的