一直都想学学ios,这东东一直被说的很好,总是没有亲自去体验体验。最近用虚拟机试了下,虚拟机简单地跑起来还不算太卡,在承受范围之内。看了一半apple官方的关于ios的指导(https://developer.apple.com/library/ios/referencelibrary/GettingStarted/RoadMapiOSCh/chapters/Introduction.html),感觉收获颇多。即使是无意做ios开发,但是看看这开发文档,会让自己有个不小的提升。
说实话object-c 跟其他的面向对象编程语言语法上还是有一些区别的。但是对于一个熟悉java,c++ ,c 的开发者来说,可以很快的开始入手。也可以很快地通晓这门语言的特点。有时候也能被这门语言的一些特性给深深地吸引住。它官方的开发文档上面说这门语言非常优秀,似乎没有吹牛。
object-c 是c语言的超集,它比ANSI c语言多出了一下语法和功能:
这是面向对象语言基本通有的特性。object-c 的类和对象,以及实例,类方法等等概念,与其他面向对象语言基本类似。具体可直接看开发文档中的说明。由于object-c是c的超集,所以肯定值支持c的,它也支持C++ 代码。关于文件扩展名,其对应如下:
头文件中放的是类的声明。一个简单的例子如下:
@interface MyCLass :NSObject
{
int count;
id data;
NSString * name;
}
-(id)initWithString:(NSString*)aName //-表示实例方法 + 表示类方法。
+(MyClass*) createMyClassWithString:(NSString*) aName withCount: (int) count;
@end
这是.h 头文件中的声明,类的属性也可以在实现文件中声明,但是在实现文件中声明的属性,都是private 的。这个是与其他语言的不同之处,当然也可以在上面的什么中指定可见性 比如
@public int count;
最后一个类方法的方法声明方式,让我非常喜欢,在Object-c中,多个参数分成多个部分,每个参数多有一个名称,一个一个地来。比如上面那个例子,可以直接度过来,创建MyClass 用一个String ,用一个Count。这样声明,感觉语言更加可读了。当然对于一个习惯了其他方式的多个参数的人来说,可能没有那种感觉。但是我喜欢。
另外一个比较有特点的是,编译器自动帮你把属性添加了get和setter 方法。
@property (nonatomic,copy) NSString *userName;
括号中的东西时用来自定选项来配置属性。其他的选项还有weak,readonly, copy 等等。
方法中属性的使用是跟java中类似的: 实例.属性名
对于类的方法,使用的方式是通过下面这样的
MyClass * myClass = [MyClass createMyClassWithString:@"hello" withCount:3];
这是一个在c++ 和 java 中不曾出现的特性。文档上面如是说的:块 是封装工作单元的对象,即可在任何时间执行的代码段。它们在本质上是可一直的匿名函数,可作为方法和函数的参数传入,或可从方法和函数中返回。块本身具有一个已类型的参数列表,且可能具有推断或声明的返回类型。您还可以将块赋值给变量。然后就像调用函数一样调用它。
int (^myBlock)(int) = ^(int num){ return num * multiplier;};
^是块的语法标记,我个人看法是形式上类似于匿名类。可以看出是一个变量,也可以是传参数。比匿名类还多了一个点是,还有返回值。这是一个很重要的概念。在我看的后面东西当中,这个也会涉及到。比如说出现循环引用。出现了一些未曾见过的东西,有时候让人有点兴奋。看ios开发文档,这个block确实让我特感兴趣。下面是ios开发文档上面一幅图。
这幅图会让你对对block的特性有一个直接性的认识。
块共享局部词法作用范围内的数据。块的这项特征非常有用,因为如果您实现一个方法,并且该方法定义一个块,则该块可以访问该方法的局部变量和参数(包括堆栈变量),以及函数和全局变量(包括实例变量)。这种访问是只读的,但如果使用 __block 修饰符声明变量,则可在块内更改其值。即使包含有块的方法或函数已返回,并且其局部作用范围已销毁,但是只要存在对该块的引用,局部变量仍作为块对象的一部分继续存在。
作为方法或函数参数时,块可用作回调。被调用时,方法或函数执行部分工作,并在适当时刻,通过块回调正在调用的代码,以从中请求附加信息,或获取程序特定行为。块使调用方在调用时能够提供回调代码。块从相同的词法作用范围内采集数据(就像宿主方法或函数所做的那样),而非将所需数据打包在“关联”结构中。由于块代码无需在单独的方法或函数中实现,您的实施代码会更简单且更容易理解。
Object-C 框架具有很多包含块参数的方法。
Object-C中只能够单继承。也就是说一个类只能有一个父类,但是却可以声明实现多个协议。协议和类别很像java中的接口
一个简单的协议的声明如下:
@protocol MyProtocol
-(void)myProtocolMethod;
@end
类别
@interface NSDate (NSDateCreation)
这行代码通过使用圆括号将类别名称括起来的语法约定,声明了该类别。 >类别是Object-C语言中一项功能,可让您扩展类的接口,而无需对类进行子类化。类别中的方法成为类类型的一部分(在程序作用范围内),而这些方法由类的所有子类继承。您可以将消息发送给类(或其子类)的任何实例,以调用在类别中定义的方法。