• [Objective-C语言教程]类和对象(24)


    Objective-C编程语言的主要目的是为C编程语言添加面向对象,类是Objective-C的核心特性,支持面向对象编程,通常称为用户定义类型。

    类用于指定对象的形式,它将数据表示和方法组合在一起,以便将数据操作到一个整齐的包中。 类中的数据和方法称为类的成员。

    1. Objective-C特征

    • 类定义在两个不同的部分,即@interface@implementation
    • 几乎所有东西都是对象的形式。
    • 对象接收消息,对象通常称为接收者。
    • 对象包含实例变量。
    • 对象和实例变量具有范围。
    • 类隐藏对象的实现。
    • 属性用于提供用于其他类对此类实例变量的访问。

    2. Objective-C类定义

    定义类时,可以为数据类型定义蓝图(或模板)。 但实际上并没有定义任何数据,但它确实定义了类名的含义,即类的对象将包含什么以及可以对这样的对象执行什么操作。

    类定义以关键字@interface开头,后跟接口(类)名称; 和一个由一对花括号括起来的类体。 在Objective-C中,所有类都派生自名为NSObject的基类。 它是所有Objective-C类的超类。 它提供了内存分配和初始化等基本方法。 例如,使用关键字class定义Box类,如下所示 -

    1 @interface Box:NSObject {
    2    //实例变量
    3    double length;    // Length of a box
    4    double breadth;   // Breadth of a box
    5 }
    6 @property(nonatomic, readwrite) double height;  // Property
    7 
    8 @end

    实例变量是私有的,只能在类实现中访问。

    3. 分配和初始化Objective-C对象

    类提供对象的蓝图,因此基本上是从类创建对象。声明一个类的对象与声明基本类型变量的声明完全相同。以下语句声明了Box类的两个对象 -

    1 Box box1 = [[Box alloc]init];     // Create box1 object of type Box
    2 Box box2 = [[Box alloc]init];     // Create box2 object of type Box

    box1box2这两个对象都有自己的数据成员副本。

    4. 访问数据成员

    使用成员访问运算符(.)访问类对象的属性。尝试下面的例子来理解 -

     1 #import <Foundation/Foundation.h>
     2 
     3 @interface Box:NSObject {
     4    double length;    // Length of a box
     5    double breadth;   // Breadth of a box
     6    double height;    // Height of a box
     7 }
     8 
     9 @property(nonatomic, readwrite) double height;  // Property
    10 -(double) volume;
    11 @end
    12 
    13 @implementation Box
    14 
    15 @synthesize height; 
    16 
    17 -(id)init {
    18    self = [super init];
    19    length = 1.0;
    20    breadth = 1.0;
    21    return self;
    22 }
    23 
    24 -(double) volume {
    25    return length*breadth*height;
    26 }
    27 
    28 @end
    29 
    30 int main() {
    31    NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];    
    32    Box *box1 = [[Box alloc]init];    // Create box1 object of type Box
    33    Box *box2 = [[Box alloc]init];    // Create box2 object of type Box
    34 
    35    double volume = 0.0;             // Store the volume of a box here
    36 
    37    // box 1 分配值
    38    box1.height = 15.0; 
    39 
    40    // box 2 分配值
    41    box2.height = 20.0;
    42 
    43    // volume of box 1
    44    volume = [box1 volume];
    45    NSLog(@"Volume of Box1 : %f", volume);
    46 
    47    // volume of box 2
    48    volume = [box2 volume];
    49    NSLog(@"Volume of Box2 : %f", volume);
    50 
    51    [pool drain];
    52    return 0;
    53 }

    执行上面示例代码,得到以下结果:

    1 $main
    2 2018-11-16 01:29:42.781 main[106799] Volume of Box1 : 15.000000
    3 2018-11-16 01:29:42.782 main[106799] Volume of Box2 : 20.000000

    5. 属性

    在Objective-C中引入了属性,以确保可以在类外部访问类的实例变量。

    各部分属性声明如下 -

    • 属性以@property开头,它是一个关键字
    • 接下来是访问说明符,它们是非原子,读写或只读,强,不安全或不完整。 这取决于变量的类型。 对于任何指针类型,可以使用strongunsafe_unretainedweak。 类似地,对于其他类型,可以使用readwritereadonly
    • 接下来是变量的数据类型。
    • 最后,将属性名称以分号结束。
    • 在实现类中添加synthesize语句。 但是在最新的XCode中,合成部分由XCode处理,不需要包含synthesize语句。

    只有属性才能访问类的实例变量。 实际上,为属性创建了内部gettersetter方法。
    例如,假设有一个属性@property(nonatomic,readonly)BOOL isDone。 创建了settergetter,如下所示。

    1 -(void)setIsDone(BOOL)isDone;
    2 -(BOOL)isDone;
  • 相关阅读:
    java.sql.SQLException: Io 异常: Got minus one from a read call
    ORACLE 数据库名、实例名、ORACLE_SID的区别
    如何查看oracle的sid
    expdp impdp 数据库导入导出命令详解
    Oracle连接数过多释放机制
    oracle查看允许的最大连接数和当前连接数等信息
    世界是无限的、复杂的、运动的
    世界
    世界观和方法论是一致的,有怎样的世界观就有怎样的方法论
    运动着的物质世界是普遍联系和永恒发展的
  • 原文地址:https://www.cnblogs.com/strengthen/p/10571761.html
Copyright © 2020-2023  润新知