• Object C中静态属性


    .NET中我们静态使用的关键字static有着举足轻重的作用,static 方法可以不用实例化类实例就可以直接调用,static 属性也是如此。在Object C中也存在static关键字,今天的学习过程使用到了这个关键字,在这里记录一下static的使用。

     

      在Object C的语法中声明后的static静态变量在其他类中是不能通过类名直接访问的,它的作用域只能是在声明的这个.m文件中 。不过可以调用这个类的方法间接的修改这个静态变量的值。对于Object C中的类使用和定义在前面已经做过相应的记录,可以查看Object C学习笔记3-对象的使用和定义。

     

     

     

      1. 静态属性

     

      Object C中静态属性的定义和.NET中的有点不一样,先看看如下代码:

     

     

    复制代码

    #import <Foundation/Foundation.h>

    @interface Person : NSObject

    {

        int age;

        NSString *name;

        static int totalCount;

        

    }

    @property int age;

    @property NSString *name;

     

    -(void) write;

     

    +(void) hello;

    @end

    复制代码

      以上代码定义 static int totalCount; 这样在编译器中编译会报错,这样的代码编写对于编译器是不认可的。正确的定义放入如下:

     

     

    复制代码

    #import <Foundation/Foundation.h>

    @interface Person : NSObject

    {

        int age;

        NSString *name;

    }

    @property int age;

    @property NSString *name;

     

    -(void) write;

     

    +(void) hello;

    @end

    复制代码

     

    复制代码

    #import "Person.h"

     

    static int count;

     

    @implementation Person

     

    @synthesize age;

    @synthesize name;

     

     

    -(void) write

    {

        NSLog(@"姓名:%@  年龄:%i",name,age);

    }

     

    +(void) hello

    {

        count++;

        NSLog(@"static = %i",count);

    }

     

     

    @end

    复制代码

      static 属性应该定义在implementation中,而且写在implementation之外或者方法之中。以上代码是将static 属性写在implementation之外。

     

     

    复制代码

    @autoreleasepool {

            for(int i=0;i<5;i++){

                [Person hello];

            }

        }

     

     

    测试结果

    2014-02-15 22:03:14.642 Object11[488:303] static = 1

    2014-02-15 22:03:14.644 Object11[488:303] static = 2

    2014-02-15 22:03:14.644 Object11[488:303] static = 3

    2014-02-15 22:03:14.645 Object11[488:303] static = 4

    2014-02-15 22:03:14.645 Object11[488:303] static = 5

    复制代码

      从以上代码可以看出,调用hello方法直接使用类名Person而非Person的实例,而且每次调用之后count都会+1.

     

     

     

      2. static属性在方法中

     

      修改代码如下,将static属性改到方法中。

     

     

    复制代码

    #import "Person.h"

     

     

     

    @implementation Person

     

    @synthesize age;

    @synthesize name;

     

     

    -(void) write

    {

        NSLog(@"姓名:%@  年龄:%i",name,age);

    }

     

    +(void) hello

    {

        static int count;

        count++;

        NSLog(@"static = %i",count);

    }

    复制代码

      使用如上方式和1中的效果一样,static属性是属于类全局的,看看测试代码就知道效果如何:

     

     

    复制代码

    @autoreleasepool {

            for(int i=0;i<5;i++){

                [Person hello];

            }

        }

     

     

    //测试结果

    2014-02-15 22:12:04.681 Object11[528:303] static = 1

    2014-02-15 22:12:04.683 Object11[528:303] static = 2

    2014-02-15 22:12:04.684 Object11[528:303] static = 3

    2014-02-15 22:12:04.685 Object11[528:303] static = 4

    2014-02-15 22:12:04.685 Object11[528:303] static = 5

    复制代码

      效果和前面的是一样的。下面再看看在实例方法中定义static 属性看看效果如下,修改代码如下:

     

     

    复制代码

    #import "Person.h"

     

     

     

    @implementation Person

     

    @synthesize age;

    @synthesize name;

     

     

    -(void) write

    {

        static int myage=0;

        myage++;

        NSLog(@"年龄:%i",myage);

    }

     

    +(void) hello

    {

        static int count;

        count++;

        NSLog(@"static = %i",count);

    }

    复制代码

      测试实例方法中的静态属性测试方法如下:

     

     

    复制代码

        @autoreleasepool {

            for(int i=0;i<5;i++){

                Person *p=[[Person alloc] init];

                p.name=[NSString stringWithFormat:@" %@ %i",@"object c",i];

                [p write];

            }

        }

     

    //测试结果如下

    2014-02-15 22:20:35.161 Object11[582:303] 姓名: object c 0  年龄:1

    2014-02-15 22:20:35.163 Object11[582:303] 姓名: object c 1  年龄:2

    2014-02-15 22:20:35.164 Object11[582:303] 姓名: object c 2  年龄:3

    2014-02-15 22:20:35.164 Object11[582:303] 姓名: object c 3  年龄:4

    2014-02-15 22:20:35.164 Object11[582:303] 姓名: object c 4  年龄:5

    复制代码

      从以上测试代码可以看出,static 属性定义到实例方法中同样适用,在调用的循环过程中for不断实例化新的实例,name属性在发生变化,而count保留上次运行的结果,这也就是static的作用。

     

     

     

      3. 静态方法

     

      在.NET中定义静态方法也需要适用static 关键字,但是在Object C并非如此。在之前我们定义方法的时候都是如下格式:

     

      - (返回值类型) 方法名: 参数,... 

     

      适用静态方法 就是将 "-" 改为 "+" 即可。

     

      +(void) hello; 在interface中定义如上方法签名,而在implementation中实现这个方法。

     

      静态方法的时候在上面的例子中已经提到过了,可详细参考!

  • 相关阅读:
    小故事
    设计模式
    git分支
    git简单操作
    ab命令压力测试
    libcheck ARM交叉编译
    libxml2 ARM 交叉编译
    I.MX6 安装LTIB
    为ARM编译Glib
    QT 4.8 中文显示问题
  • 原文地址:https://www.cnblogs.com/huibin-benteng/p/5081906.html
Copyright © 2020-2023  润新知