rss· 投稿· 设为首页· 加入收藏· 繁體版
当前位置: 火魔网 » 程序开发 » ObjC

Objective-C学习笔记(0001)

1.   扩展名                                 

      .                 头文件。头文件中包含类、类型、函数和常量的声明。

      .m              源文件。可以包含C代码和Objiect-C代码。

      .mm           源文件。除了可以包含C代码和Object-c代码外,还可以包含C++代码

2.  包含头文件

       当需要包含头文件的时候,可以使用标准的#include预编译指令,也可以使用#import指令。推荐使用#import指令,因为他能保证相同的文件永远不会被多次包含。并且Objective-c的示例和文档都建议使用#import。

3.  Strings

        Objective-C在指定字符串的时候,具有和C一样的约定。单字符使用单引号,字符串使用双引号。但是Objective-C多使用NNString类。

        NNString类是字符串的对象载体,具有处理任意长度的字符串内置的内存管理、支持Unicode、Printf风格的格式化等优点。由于一些字符串经常使用,Objective-C提供了一个速记符号从常量创建NSString对象。使用这用速记,你所要做的仅仅是在一个正常的双引号包含的字符串之前加上一个@符号。

       NSString* myString = @"My String ";

       NSString* anotherString = [NSString stringWithFormat:@"%d %s", 1, @"String"];

       // Create an Objective-C string from a C string

       NSString* fromCString = [NSString stringWithCString:"A C string" encoding:NSASCIIStringEncoding];

4.    Classes类

       (1) Objiective-C中创建一个类需要两部分:接口和实现。接口部分包含类的声明,还会定义成员变量和与类相关联的方法。实现部分包含类方法的实际实现代码。

         (2)    类声明以@interface预编译指令开始,以@end指令结束。类名之后是父类的名称,以冒号分割。类的成员变量在大括号包含的代码中声明({})。在成员变量之后的代码块是类声明的方法列表。每个成员变量和方法之后都要以分号结尾。

        @interface MyClass : NSobject

        {

                int               count;

                id                data;

                NSString*    name;

        }

        - (id)initWithString:(NSString*)aName;

       + (MyClass*)createMyClassWithString:(NSString*)aName;

       @end

        (3)    类的实现。是由两个预编译指令来指示:@implementation和@end。方法的定义于接口中声明的要匹配。

       @implementation MyClass

       - (id)initWithString:(NSString*)aName

       {

              count = 0;

              data   = nil;

              name = [aName copy];

              return self;

        }   

        + (MyClass*)createMyClassWithString:(NSString*)aName

             return [[MyClass alloc] initWithString: aName];

        @end

        (4)   当使用变量存储对象时,经常会使用指针类型。Objective-C中,强类型和若类型变量都可以保存对象。强类型指针的变量在声明时必须包含类名。集合类经常使用弱类型指针。

           MyClass* myObject1; // 强类型
           id myObject2; //弱类型

5   Methods

        (1)   Objective-C语言中的类可以声明两种方法:实例方法和类方法。实例方法必须先声明一个类的实例,然后才可以使用这个实例来调用实例方法。类方法则不需要创建类的实例。

       (2)    方法的声明有方法类型标识符、返回类型、一个或多个署名关键字和参数的名称、类型信息组成。方法声明的前面加上一个符号“-”,这说明这个方法是一个实例方法。方法声明中,冒号说明参数的存在。如果方法没有参数,第一个署名关键字之后可以忽略冒号。

      (3)     当调用一个方法时,要通过“messaging”来通知相应的对象。消息就是方法名和这个方法所需要的参数信息。发送到对象的所有消息是动态发送的,这有利于Objective-C的多态性。既是:如果子类定义了与父类同名的方法,子类会第一个受到消息,然后可以选择是否要奖这个消息转交给他的父类。

     (4)     消息都是放在方括号中。在方括号中,收消息的对象放在左边,消息(和消息需要的参数)放在右边。为避免声明大量局部变量来存储临时数据,Objective-C支持嵌套消息。每一个嵌套消息的返回值都可以作为另一个消息的参数或者是目标。

    (5)      类方法的定义语法与实例方法是完全一样的,只有一点不同。类方法使用加法符号(+),而不是减法符号作为方法的类型标识符。

6    属

      (1)   属性是一种便利符号,用来代替存取方法(accessor methods)。属性并不是在类的声明中创建一个新的成员变量。他们仅仅为定义用来访问已经存在的变量的方法指定的快捷方式。类可以使用属性标记来公开成员变量,而不是使用getter和setter方法。类还可以使用属性来公开“virtual”(虚)的成员变量―它是动态计算的一部分数据并且并不实际存储在成员变量中。
       实际点说,属性的使用减少了你的冗余代码量。应为大部分存取方法用相似的方式实现,使用属性可以不必为每一个成员变量提供截然不同的getter和 setter方法。相反,你可以使用属性的声明指定具体的动作,在编译的时,会根据声明合成实际的getter和setter方法。
      因为属性的声明会创建实际的方法,可以和方法的声明一起定义在类的接口中。基本的定义使用@property预编译指令,后边是属性的类型信息和名称。可以使用定制选项配置属性,它定义了存取方法有怎样的行为。下面的例子显示了一些简单的类型声明:
           @property BOOL flag;
           @property (copy) NSString* nameObject;  // 赋值过程中拷贝对象
           @property (readonly) UIView* rootView;  // 仅创建getter方法  属性的另一个好处是在代码中可以使用点语法来访问他们,如下演示:
            myObject.flag = YES;
            CGRect   viewFrame = myObject.rootView.frame;  

          尽管上面的例子中的对象和属性的名字很做作,但是他们演示了属性的灵活性。点语法实际上屏蔽了相关一系列方法的调用。每个可读属性由同名的方法支持。每个可写属性由附加的方法setPropertyName:支持,在这里属性名称的第一个字母大写了。(这些方法是属性的实际实现,同时也是可以在没有成员变量支持的类中包含属性定义的原因。)不用属性去实现上面代码完成的功能,你需要编写如下代码:
            [myObject setFlag:YES];
           CGRect   viewFrame = [[myObject rootView] frame];  

          关于在类中如何声明属性的更多信息,请查阅Objective-C程序设计中”属性”一节。

7   协议和代理\

         协议声明的方法可以被任何一个类实现。协议不是类本身。他们仅定义了其它对象有责任实现的接口。当在自己的类中实现协议的方法时,你的类就是遵守这个协议的。
   iPhone OS中,协议经常被用作实现代理对象。代理对象是一个能代表其它对象或与其它对象合作的一个对象。学习协议、代理和其它对象相互影响的最好方法就是从例子中学习。
    UIApplication类实现了应用程序所需的功能。不是强制继承UIApplication类来接收一个简单的应用程序当前状态的通知,而是 UIApplication类调用赋值给代理对象的方法来分发这些通知。实现了UIApplicationDelegate协议方法的对象可以接收这些通知并提供合适的响应。
   协议的声明类似于类接口的声明,有一点不同的是,协议没有父类,并且不能定义成员变量。下面的例子演示了只有一个方法的协议的声明:
          @protocol MyProtocol
           - (void)myProtocolMethod;
          @end

         很多代理协议中,采用协议只是大概实现了协议中定义的方法。一些协议需要明确声明支持的协议,但是现在假设仅实现方法就足够了。 

           

顶一下
(0)
踩一下
(0)