ios培训 Objective-C语法大讲堂(一)

这一节是对Objective-C的简要介绍,目的是使读者对Objective-C有一个概括的认识。
1.面象的读者
              在阅读本文之前,应具备使用与C类似的编程语言(如C,C++,JAVA)的一些经验,同时熟悉面向对象编程。   
2.Objective-C简介
              Objective-C是以SmallTalk为基础,建立在C语言之上,是C语言的超集。20世纪80年代早期由 Brad J.Cox设计,2007年苹果公司发布了Objective-C 2.0,并在iPhone上使用Objective-C进行开发。
3.Objective-C学习内容
               学习的内容主要包括语法和Cocoa框架两部分。本文主要对语法进行介绍。
4.IDE
      编写Objective-C程序最主要的编译环境是Xcode,它是苹果官方提供的IDE,官网中的SDK包括Xcode,可以通过下载SDK来获得它。但是Xcode只支持MacOS X,所以如果要在其它环境下编写Objective-C程序,要使用其它IDE。Linux/FreeBSD用GNUStep,Windows NT5.x(2000,XP)要先安装cywin或mingw,然后安装GNUStep。同时仅仅通过文本编辑器,GCC的make工具也可以用于开发。
注:如果要使用到Cocoa的话,只能在Apple公司的Xcode上。   

5.框架
               Objective-C编程中主要用到的框架是Cocoa,它是MacOS X中五大API之一,它由两个不同的框架组成FoundationKit 和ApplicationKit。 Foundation框架拥有100多个类,其中有很多有用的、面向数据的低级类和数据类型,如NSString,NSArray, NSEnumerator和NSNumber。ApplicationKit包含了所有的用户接口对象和高级类。这些框架本文不做重点介绍,如果要深入了解可以去看Xcode自带的文档。
6.特别之处
初次接触Objective-C时,会发现许多和其它语言不同的地方,会看到很多的+,-,[ ,] ,@, NS等符号,这些符号在以后的编程中将经常看到,这部分内容在第二节中介绍。先熟悉一下Objective-C的代码:
#import                    "ClassA.h"
                    #import                   
                   
     int                    main( int argc, const char *argv[] ) {
                          ClassA                    *c1 = [[ClassA alloc] init];
                          ClassA                    *c2 = [[ClassA alloc] init];
                   
                   
                          //                    print count
                          printf(                    "ClassA count: %i\n", [ClassA initCount] );
                   
                          ClassA                    *c3 = [[ClassA alloc] init];
                   
                   
                          //                    print count again
                          printf(                    "ClassA count: %i\n", [ClassA initCount] );
                   
                   
                          [c1                    release];
                          [c2                    release];
                          [c3                    release];
                   
                          return                    0;
                    }
             
    除了这些语言要素上的不同,Objective-C也提供了一些很好的特性,如类别,扮演(Posing)等,这些在运行时的特性使得编程更加灵活。
7.优缺点
              每一个语言都有其优缺点,Objective-C也不例外,这就要求在选择语言时权衡利弊。对于Objective-C,只要善于利用它的优点,你会发现它是一个简单,灵活,高效的语言。以下列举了它的一些特点:
      优点:类别、扮演(Posing)、动态类型、指针计算、弹性信息传递、不是一个过度复杂的c衍生语言、可通过Objective-c++与c++结合
      缺点:没有命名空间、没有操作符重载、不像c++那样复杂


第二节对C的扩展


1.扩展名
          Objective-C是ANSI版本C的一个超集,它支持相同的C语言基本语法。与C一样,文件分为头文件和源文件,扩展名分别为.h和.m。如果要加入c++的语法,需要用到.mm,这里不做介绍。

.h
                                              头文件。头文件包涵类的定义、类型、方法以及常量的声明
             
                    .m
                                              源文件。这个典型的扩展名用来定义源文件,可以同时包含C和Objective-C的代码。
             




2.#import
     在Objective-C里,包含头文件有比#include更好的方法#import。它的使用和#include相同,并且可以保证你的程序只包含相同的头文件一次。相当于#include+ #pragma once的组合。
例如要包含Foundation框架中的Foundation.h文件,可以像下面这样。

                    #import
             
注:每个框架有一个主的头文件,只要包含了这个文件,框架中的所有特性都可以被使用。


3.@符号
               @符号是Objective-C在C基础上新加的特性之一。常见到的形式有@”字符串”,%@ , @interface,@implement等。@”字符串”表示引用的字符串应该作为Cocoa的NSString元素来处理。@interface等则是对于C的扩展,是Objective-C面向对象特性的体现。
注:这里提一个小技巧,只要看到@符号,就可以认为它是对于C的一个扩展。

4.NSLog()
           在Objective-C中用的打印函数是NSLog(),因为Objective-C是加了一点”特殊语料”的C语言,所以也可以用printf()但是NSLog()提供了一些特性,如时间戳,日期戳和自动加换行符等,用起来更方便,所以推荐使用NSLog()。下面是两种输出的对比。
              使用NSLog()输出任意对象的值时,都会使用%@格式说明。在使用这个说明符时,对象通过一个名为description的方法提供自己的NSLog()格式。
              下面分别是使用NSLog()和使用printf()的相应输出:


                    2010-10-15 14:54:21。426                    10_15[1973:207] Hello World!
                    Hello                    World!
             
注:NS前缀告诉你函数来自Cocoa而不是其他工具包。


5.BOOL
               BOOL是Objective-C中的布尔类型,它和C中的bool有如下区别


                                                                                             
                    BOOL
                                              YES(1),NO(0)
             
                    bool
                                              true(!0),false(0)
             
6.id
              这是Objective-C新加的一个数据类型,它是一般的对象类型,能够存储任何类型的方法。

7.nil
              在Objective-C中,相对于C中的NULL,用的是nil。这两者是等价的。下面是nil的定义。


                                 
                    #define                    nil NULL
             
第三节创建对象

1.接口和实现
在Objective-C中定义一个类需要有两个部分:接口和实现。接口文件包含了类的声明,定义了实例变量和方法。实现文件包含了具体的函数的实现代码。下图显示了一个叫MyClass的类,它继承自NSObject基类。类的定义总是从@interface开始到@end结束。在类名后面的是父类的名称。实例变量被定义在两个花括号之间。在实例变量下面的是方法的定义。一个分号用来结束一个变量或者方法。


下面的代码显示了MyClass这个类的实现代码。就像类的定义规则一样,类实现文件也被两个标识框起来,一个是@implementation,还有一个是@end。这两个指令标识符告诉编译器程序从哪里开始编译到哪里结束。类中的方法名称的定义和它接口文件中的定义是一样的,除了实现文件中有具体的代码以外。


                    @implementation                    MyClass
                   
                   
                                      (id)initWithString NSString *) aName
                    {
                         if                    (self = [super init]) {
                               count                    count = 0;
                               data                    = nil;
                               name                    = [aName copy];
                               return                    self;
                         }
                    }
                                      (MyClass *)createMyClassWithString: (NSString *) aName
                    {
                         return                    [[[self alloc] initWithString:aName] autorelease];
                    }
                    @end
             
当你要把一个对象保存进变量,要使用指针类型。Objective-C同时支持强和弱变量对象。强类型对象在变量类型定义的时候包含了类名。弱对象使用id类型作为实例变量。下面的例子同时显示了定义MyClass中的强弱两种类型的变量

                    MyClass*                     myObject1;      // Strong typing
                    id                               myObject2;      // Weak typing
             

2.方法
              一个方法定义包含了方法类型,返回类型,一个或者多个关键词,参数类型和参数名。在Objective-C中一个类中的方法有两种类型:实例方法,类方法。实例方法前用(-)号表明,类方法用(+)表明,通过下图可以看到,前面有一个(-)号,说明这是一个实例方法。


在Objective-C中,调用一个方法相当于传递一个消息,这里的消息指的是方法名和参数。所有的消息的分派都是动态的,这个体现了Objective-C的多态性。消息调用的方式是使用方括号。如下面的例子中,向myArray对象发送insertObject:atIndex:这个消息。


                    [myArray                    insertObject:anObj atIndex:0];
             

     这种消息传递允许嵌套


                    [[myAppObject                    getArray] insertObject:[myAppObject getObjectToInsert] atIndex:0];
             
前面的例子都是把消息传递给实例变量,你也可以把消息传递给类本身。这时要用类方法来替代实例方法。你可以把他想象成静态C++类(当然不完全相同)。
类方法的定义只有一个不一样那就是用加号(+)代替减号(-)。下面就是使用一个类方法。

                    NSMutableArray*                        myArray = nil;      // nil is essentially the same as NULL
                    //                    Create a new array and assign it to the myArray variable.
                    myArray =                    [NSMutableArray arrayWithCapacity:0];
             
3.属性
           属性提供了比方法更方便的访问方式。通过property标识符来替代getter和setter方法。使用方法就是在类接口文件中用@property标识符,后面跟着变量的属性,包括 copy, tetain, assign ,readonly , readwrite,nonatomic,然后是变量名。同时在实现文件中用@synthesize标识符来取代getter和setter方法。

                    @property                    BOOL flag;
                    @property                    (copy) NSString* nameObject;                       
                    //                    Copy the object during assignment.
                    @property                    (readonly) UIView* rootView;    // Create only a getter method
             


接口文件中使用@property


                    @synthesize                    flag,nameObject,rootView;
             


实现文件中使用@synthesize


属性的另一个好处就是,可以使用点(.)语法来访问,如下所示:


                    myObject.flag                    = YES;
                    CGRect                        viewFrame = myObject.rootView.frame;
             




第四节继承


              继承的语法如下,冒号后的标识符是需要继承的类。


                                 
                    @interface                    Circle : NSObject
             
1.不支持多继承
              要注意的是Objective-C只支持单继承,如果要实现多继承的话,可以通过类别和协议的方式来实现,这两种方法将在后面进行介绍。
2.Super关键字
               Objective-C提供某种方式来重写方法,并且仍然调用超类的实现方式。当需要超类实现自身的功能,同时在前面或后面执行某些额外的工作时,这种机制非常有用。为了调用继承方法的实现,需要使用super作为方法调用的目标。下面是代码示例:


                    @implementation                    Circle
                    -(void)setFillColor:                    (ShapeColor) c
                    {
                          if                    (c== kRedColor){
                                                    = kGreenColor;
                          }
                                             [super                    setFillColor: c];
                    }
                    @end
             
Super来自哪里呢?它既不是参数也不是实例变量,而是由Objective-C编译器提供的某种神奇功能。向super发送消息时,实际上是在请求Objective-C向该类的超类发送消息。如果超类中没在定义该消息,Objective-C将按照通常的方式在继承链中继续查找对应的消息。

  第九城市ios培训 unity3D培训开班!咨询电话:4006809667

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值