Objective-C 入门

  • 无C、C++等语言基础,约3年JavaEE开发经验,期间接触过Android

  • 穷!~用的是黑苹果,有这个意向的朋友,强烈推荐(远景MacIdea),多爬楼,多搜索


 在我的建议里,想搞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";是编译不通过的

posted @ 2013-03-07 18:15  ice_liu  阅读(1132)  评论(3)    收藏  举报