`
lovebirdegg
  • 浏览: 171472 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

《iPhone应用程序开发指南(基础篇)》第三章 3.4

阅读更多

原文地址:http://www.aisidechina.com/blog

版权所有:AisideChina

本博客将在今后陆续进行本书的连载,敬请关注!
更多内容请大家购买正版《iPhone应用程序开发指南(基础篇)》

  

3.4             Objective-C中的面向对象

        面向对象编程(Object-Oriented Programming,简称OOP)如今已不再是什么新鲜的术语了。Objective-C就是一种面向对象编程语言。

        在Objective-C中创建一个新类时,通常先要在一个与类名相同的.h文件中,使用关键字@interface来声明该类;然后在与类名相同的一个.m文件中,使用关键字@implement来实现该类。

本节将会对如何在Objective-C中声明和实现一个类进行讲解。

类的声明

        在Objective-C中声明一个类时,需要使用@interface关键字,它类似C++中的class关键字。声明一个类的格式如下:

=================================================

代码3.4 Objective-C中类的声明

@interface ClassName : SuperClass {

@private

         vType variable1;

         ……

}

+ (rType)classMethodWithArg1: (arg1Type)arg1,

andArg2: (arg2Type)arg2;

- (rType)instanceMethodWithArg1:(arg1Type)arg1

andArg2:(arg2Type)arg2;

@end

================================================

类的实现

        对一个类进行了声明之后,还必须要实现该类的方法才可以创建对象。

===================================================

代码3.5  Objective-C中类的实现

@implement ClassName

         Methods Implementation

         ……

@end

===================================================
        在@implement与@end之间实现类的各个方法,方法可以是从父类继承下来的,也可以是自己声明的。

(具体讲解与实例请参见《iPhone应用程序开发指南(基础篇)》一书)

初始化方法

        前面我们讲到过要创建一个可用的对象,在Objective-C中需要两个步骤来完成:创建对象与初始化对象。创建对象即我们前面讲到过的alloc方法,alloc方法负责为该类对象分配一个足够大的内存,然后将整块内存区域全部初始化为0,也就是使被创建的对象不包含任何数据:比如int类型变量全被初始化为0,float类型变量全被初始化为0.0,指针类型全被初始化为nil等。

        创建之后便可以调用初始化函数来对对象进行初始化。由于任何Objective-C类都是NSObject类的子类,所以它们都从NSObject类中继承了初始化方法init,但该方法对于各子类基本没有任何作用与意义,子类需要根据自己类的具体情况来重写初始化方法,从而达到想要的初始化效果。

        但要通过初始化方法来对对象进行初始化,也并不是一定要使用继承自NSObject的init方法,通常情况下对对象进行初始化时往往需要一些参数。如NSString类的一个初始化方法:initWithString: (NSString *)aString,它表示要接收一个字符串aString,并用该字符串来对调用该方法的NSString对象进行初始化。

Tips:事实上,初始化方法与一般方法没有本质上的区别,它只是在名称上添加“init”字样来表示这是一个初始化方法。它将负责为类中某些成员变量赋值。我们可以将初始化方法理解为该类的一个特殊的成员方法。 
 

        对于NoteClass,我们可以在NoteClass.h文件中添加下面的一个初始化方法来对NoteClass类的对象进行初始化:

- (id)initWithDate:(NSString *)aDate andContent:(NSString *)aContent;

在NoteClass.m文件中,该方法的实现如下:

===================================================

代码3.9  -(id)initWithDate: andContent:的实现

- (id)initWithDate:(NSString *)aDate

        andContent:(NSString *)aContent {

         if(self = [super init]){

                   [self setDate:aDate];

                   [self setContent:aContent];

         }

         return self;

}

====================================================

(具体讲解与实例请参见《iPhone应用程序开发指南(基础篇)》一书)

属性

        实现一个类时,还要为每一个变量实现其访问器,这是一个相当繁琐的工作。事实上,在Objective-C 2.0发布后,我们便可以很方便的使每一个变量自动生成其访问器,并使用点操作符“.”来实现对变量的存取操作。

要实现这个功能,可以将NoteClass.h文件修改如下:

===================================================

代码3.14  NoteClass.h文件

         #import <Cocoa/Cocoa.h>

         @interface NoteClass : NSObject {

                  NSString *date;

                  NSString *content;

         }

         @property (nonatomic, retain) NSString *date;

         @property (nonatomic, retain) NSString *content;

         – (id)initWithDate:(NSString *)aDate andContent:(NSString *)aContent;

         – (id)initWithDate:(NSString *)aDate;

         – (void)setDate:(NSString *)aDate;

         – (NSString *)date;

         – (void)setContent:(NSString *)aContent;

         – (NSString *)content;

    – (void)showNote;

       @end

 ==================================================

        在上面的代码中注释掉了date变量与content变量的访问器方法,取而代之的是@property (nonatomic,retain) NSString *date与@property (nonatomic, retain) NSString *content。

        在Objective-C中,@property用来设置成员变量的读写属性(readwrite/readonly),赋值语义(assign/retain/copy)以及对于多线程的支持atomicity(nonatomic)。并且每组的各个选项只可以出现一个或者不出现,比如这个例子中的@property (nonatomic, retain) NSString *date,表示date变量不支持多线程,且在被赋值时将自动调用release方法来释放对旧值的所有权,然后调用retain方法申请对新值的所有权。下表对@property的各个选项进行了总结:(具体讲解与实例参见《iPhone应用程序开发指南(基础篇)》一书)。

0
1
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics