開始学习iPhone开发了,尽管如今已经有了Swift,但我还是老老实实地学习Objective-C,鄙人入门的程序语言是C,后来学习了C#和Java,如今来学Objective-C,这篇仅仅是一些非常简略的笔记,不算是语法书。
Objective-C的代码文件有3种,“*.h”的头文件;”*.m”是普通的源码文件,里面可包括Objective-C和C的代码;“*.mm”也是源文件的一种,里面可包括Objective-C,C和C++的代码。
1 #import <UIKit/UIKit.h> 2 #import "HGAppDelegate.h" 3 4 int main(int argc, char *argv[]) 5 { 6 printf("Hello world\n"); 7 NSLog(@"Hello world"); 8 }
代替了曾经熟悉的#include预处理命令,换成了#import,但尖括号“<”,“>”还有双引號的意义与曾经一样,printf语句依旧能输入那句经典的Hello world,在Objective-C中就有了一种新的方式——NSLog(@"Hello world");大凡以NS前缀开头的类都是系统预先定义好的类,比方字符串NSString,后来的NSArray等。NSLOG传入了參数也是“Hello world”,但前面多加了一个@,这个是Objective-C字符串的写法,假设要声明一个字符串的变量并附初值@”Hello world”,则是
NSString *str=@”Hello world”;
Objective-C的基本数据类型和C中的一样的,int是整形,char是字符,float是单精度浮点数,double是双精度浮点数,与C有点差别的在于short和long,这两种在Objective-C写法是short int和long int,在这里多了一个长双精度的类型long double。无符号的在前面多加了一个unsigned,写法如unsigned int。
SEL sel=@selector(方法签名)
或
SEL sel=NSSelectorFromString(方法名的字符串)
调用的时候则是下面形式
[obj performSelector:sel withObject: nil];
上面obj是对象的实例,sel则是SEL类型的变量,nil则是obj对象的默认值,假设保险起见,调用前要先推断obj对象有没有那个方法,则调用以下的方法,它会返回布尔值,ture就是存在,反之则不存在。
[obj respondsToSelector:sel]:
假设要获取SEL变量所指向的方法的方法名时,能够调用以下的方法,它返回的是一个字符串。
NSStringFromSelector(sel变量):
这里讲两种语句switch和foreach,由于这个在C#和Java之间都会有所差别。
Objective-C类的定义分声明与实现两个操作,感觉和接口的定义与实现非常像。
@interface ClassName : NSObject { //字段定义 } //方法,属性等其它成员的声明 @end
@implementation ClassName //方法,属性等其它成员的实现 @end
方法的声明语法例如以下
+(void)methodName(paraType1)paraName1 and:(paraType2)paraName2;
+代表的是静态方法,-代表的是实例的方法;后面的括号代表的是返回类型,这里比如上面的方法是空返回void;方法名总在參数的前面,Objective-C的方法名非常特殊,按上面声明的方法,它的方法名师methodName and;參数则是以 :(ParaType)ParaName的形式,假设没有參数,则方法名后面直接以分号“;”结束。调用则通过下面的形式,objIns则是对象的实例名。
[objIns methodName:value1 and:value2];
对于私有字段而已要对其获取或设置都要通过get/set方法来进行,在Java中通过声明getter/setter方法来实现面向对象编程中的封装性,在Objective-C中也有这类getter/setter方法,称之为存取方法。
比如如今有字段int count,他相应的存取方法是
-(void) setCount: (int)couValue; -(int) count;
Setter方法则是以set+相应的字段名,setter直接与字段同名。在调用的时候能够用通常方括号的形式”[” ”]”当不普通方法来调用,能够使用类似C#,Java中点”.”的方式调用,假设点的方式调用,则直接跟上字段的名字则可,如
MyClass.count=12; Int count=myclass.count;
假设声明了一个属性,则系统会自己主动为其生成getter/setter方法。这个与C#的属性挺类似,可是语法形式大不同样。它与类的定义一样,分别有声明与实现两部分
@property(修饰符) int count;
实现
@synthesize count;
假设在实现的时候要指定这个属性是对那个字段经行封装的,能够通过以下的形式,以下则代表了对count字段的封装,记得指定时有加下划线”_”
@synthesize count=_count;
在声明的时候能够指定修饰符,修饰符能够用多个,每一个间用逗号隔开,修饰符及其作用例如以下所看到的
假设不使用系统自己主动生成的getter或setter方法,能够通过在修饰符的地方指定自定义的getter方法和setter方法的签名,如
@property(getter=mygetter,setter=mysetter:) int count;
又叫作代码块,声明的语法例如以下
ReturnType(^BlockName)=^(paraType1 para1,paraType2 para2){ /*代码内容*/ };
等号左边相当于声明块的变量,等号右边相当于块的字面值,块的效果类似于Lumbda表达式,调用时就如C/C#中调用方法那样
BlockName(para1,para2);
语法例如以下
@protocol ProtocoName //方法声明 @optional //可选实现 //方法声明 @required//必须实现 //方法声明 @end
这个类似于接口,实现是在类的声明处以以下的形式
@interface ClassName:NSObject<ProtocoName1,…..>
语法例如以下
@interface ClassName(CategoryName) //方法声明 @end //其它代码 @implementation ClassName(CategoryName) //方法声明 @end
用于给已经定义的类扩展方法,ClassName是已经定义的类,要被扩展的类,CategoryName是类别名,类别中的方法假设遇到方法签名一样的方法,则会覆盖原有的方法;类别中的成员仅仅局限于方法,字段那些是不能定义的;若是覆盖了方法,那么那个覆盖的作用域是整个程序。
在開始时调用
NSAutoreleasePool *pool=[ [NSAutoreleasePool alloc] init];
结束的时候
[pool release];
构造对象
[[ClassName alloc] init];
释放对象
[ClassInsName release];
规则:1)自己用alloc或者copy创建的对象,在用完的时候要release;2)对不是自己创建的对象,则不要去release;3)retain对象后,要realease,两者要对称,有多少个retain就要有多少个release。
Objective-C的异常处理与C#和Java差点儿相同,也是由try catch finally语句块组成,抛异经常使用throw。格式例如以下
@try { } @catch(NSException *ex) { @throw } @finally { }
和C#的keyword一样的,仅仅是多了个“@”,catch块中的@thorw仅仅是为了演示用。
在Objective-C中NSError让人的感觉与NSException类似,都是与错误有关,但实际上两者在使用方法上大有不同,NSException是异常,记录异常的信息,异常是在程序出现,会让程序卡住的。NSError是错误,是记录错误的信息,比如调用了某些方法失败后,会在传入方法的NSError对象中填写相关的错误信息,有NSError不会让程序卡死,但出现了NSException不捕捉则会让程序卡死,NSException能够被抛出和捕捉,NSError没有抛出和捕捉这个概念。