学习ios笔记(一)

一直都想学学ios,这东东一直被说的很好,总是没有亲自去体验体验。最近用虚拟机试了下,虚拟机简单地跑起来还不算太卡,在承受范围之内。看了一半apple官方的关于ios的指导(https://developer.apple.com/library/ios/referencelibrary/GettingStarted/RoadMapiOSCh/chapters/Introduction.html),感觉收获颇多。即使是无意做ios开发,但是看看这开发文档,会让自己有个不小的提升。

编程语言特性

说实话object-c 跟其他的面向对象编程语言语法上还是有一些区别的。但是对于一个熟悉java,c++ ,c 的开发者来说,可以很快的开始入手。也可以很快地通晓这门语言的特点。有时候也能被这门语言的一些特性给深深地吸引住。它官方的开发文档上面说这门语言非常优秀,似乎没有吹牛。

C语言的超集

object-c 是c语言的超集,它比ANSI c语言多出了一下语法和功能:

  • 定义新的类
  • 类和实例方法
  • 方法调用(称为发消息)
  • 属性声明(以及通过它们自动合成存取方法)
  • 静态和动态类型化
  • 块(block),已封装的、可在任何时候执行的多段代码
  • 基本语言的扩展,例如协议和类别

类和对象以及方法

这是面向对象语言基本通有的特性。object-c 的类和对象,以及实例,类方法等等概念,与其他面向对象语言基本类似。具体可直接看开发文档中的说明。由于object-c是c的超集,所以肯定值支持c的,它也支持C++ 代码。关于文件扩展名,其对应如下:

 
扩展名 | 源类型 
:--|:-- 
.h | 头文件。包含类,类型,函数,常量的声明 .m | 实现文件,包含扩展名的,可以同时包含object-c 和c 代码 .mm | 实现文件。除了可包含object-c和c 代码外,还可以包含C++ 代码。**只当您实际引用您的Object-c代码中的C++类或者功能时,才使用此扩展名。**

头文件中放的是类的声明。一个简单的例子如下:

  
  
  
  
  1. @interface MyCLass NSObject
  2. {
  3. int count;
  4. id data;
  5. NSString * name;
  6. }
  7. -(id)initWithString:(NSString*)aName //-表示实例方法 + 表示类方法。
  8. +(MyClass*) createMyClassWithString:(NSString*) aName withCount: (int) count;
  9. @end

这是.h 头文件中的声明,类的属性也可以在实现文件中声明,但是在实现文件中声明的属性,都是private 的。这个是与其他语言的不同之处,当然也可以在上面的什么中指定可见性 比如

  
  
  
  
  1. @public int count;

最后一个类方法的方法声明方式,让我非常喜欢,在Object-c中,多个参数分成多个部分,每个参数多有一个名称,一个一个地来。比如上面那个例子,可以直接度过来,创建MyClass 用一个String ,用一个Count。这样声明,感觉语言更加可读了。当然对于一个习惯了其他方式的多个参数的人来说,可能没有那种感觉。但是我喜欢。

另外一个比较有特点的是,编译器自动帮你把属性添加了get和setter 方法。

  
  
  
  
  1. @property (nonatomic,copy) NSString *userName;

括号中的东西时用来自定选项来配置属性。其他的选项还有weak,readonly, copy 等等。

方法中属性的使用是跟java中类似的: 实例.属性名

对于类的方法,使用的方式是通过下面这样的

  
  
  
  
  1. MyClass * myClass = [MyClass createMyClassWithString:@"hello" withCount:3];

这是一个在c++ 和 java 中不曾出现的特性。文档上面如是说的: 是封装工作单元的对象,即可在任何时间执行的代码段。它们在本质上是可一直的匿名函数,可作为方法和函数的参数传入,或可从方法和函数中返回。块本身具有一个已类型的参数列表,且可能具有推断或声明的返回类型。您还可以将块赋值给变量。然后就像调用函数一样调用它。

  
  
  
  
  1. int (^myBlock)(int) = ^(int num){ return num * multiplier;};

^是块的语法标记,我个人看法是形式上类似于匿名类。可以看出是一个变量,也可以是传参数。比匿名类还多了一个点是,还有返回值。这是一个很重要的概念。在我看的后面东西当中,这个也会涉及到。比如说出现循环引用。出现了一些未曾见过的东西,有时候让人有点兴奋。看ios开发文档,这个block确实让我特感兴趣。下面是ios开发文档上面一幅图。

这幅图会让你对对block的特性有一个直接性的认识。

块共享局部词法作用范围内的数据。块的这项特征非常有用,因为如果您实现一个方法,并且该方法定义一个块,则该块可以访问该方法的局部变量和参数(包括堆栈变量),以及函数和全局变量(包括实例变量)。这种访问是只读的,但如果使用 __block 修饰符声明变量,则可在块内更改其值。即使包含有块的方法或函数已返回,并且其局部作用范围已销毁,但是只要存在对该块的引用,局部变量仍作为块对象的一部分继续存在。

作为方法或函数参数时,块可用作回调。被调用时,方法或函数执行部分工作,并在适当时刻,通过块回调正在调用的代码,以从中请求附加信息,或获取程序特定行为。块使调用方在调用时能够提供回调代码。块从相同的词法作用范围内采集数据(就像宿主方法或函数所做的那样),而非将所需数据打包在“关联”结构中。由于块代码无需在单独的方法或函数中实现,您的实施代码会更简单且更容易理解。

Object-C 框架具有很多包含块参数的方法。

协议和类别

Object-C中只能够单继承。也就是说一个类只能有一个父类,但是却可以声明实现多个协议。协议和类别很像java中的接口

一个简单的协议的声明如下:

  
  
  
  
  1. @protocol MyProtocol
  2. -(void)myProtocolMethod;
  3. @end

类别

  
  
  
  
  1. @interface NSDate (NSDateCreation)

这行代码通过使用圆括号将类别名称括起来的语法约定,声明了该类别。 >类别是Object-C语言中一项功能,可让您扩展类的接口,而无需对类进行子类化。类别中的方法成为类类型的一部分(在程序作用范围内),而这些方法由类的所有子类继承。您可以将消息发送给类(或其子类)的任何实例,以调用在类别中定义的方法。

已定义的类型和编码策略

  • id 动态对象类型。动态类型化的对象和静态类型化的对象的否定字面常量,都是 nil。
  • Class 动态类类型。其否定字面常量是 Nil。
  • SEL 选择器的数据类型 (typedef);此数据类型表示运行时的方法签名。其否定字面常量是 NULL。
  • BOOL Boolean 类型。字面常量值是 YES 和 NO。
个人博客地址:http://boyhouzhi.com/2014/02/19/start-develop-ios-1/

你可能感兴趣的:(ios,ios开发)