zoukankan      html  css  js  c++  java
  • 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中实现这个方法。

     

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

  • 相关阅读:
    leetcode 33. Search in Rotated Sorted Array
    leetcode 32. Longest Valid Parentheses
    leetcode 28. Implement strStr()
    leetcode 27. Remove Element
    leetcode 26. Remove Duplicates from Sorted Array
    leetcode 24. Swap Nodes in Pairs
    leetcode 22. Generate Parentheses
    树莓派的频率管理和热控制
    sql执行insert插入一条记录同时获取刚插入的id
    全程直播个人博客重构过程,采用springboot+dubbo+jpa技术栈。
  • 原文地址:https://www.cnblogs.com/huibin-benteng/p/5081906.html
Copyright © 2011-2022 走看看