在.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属性定义

  以上代码定义 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

正确的static属性定义-interface

#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

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

@autoreleasepool {
for(int i=;i<;i++){
[Person hello];
}
} 测试结果
-- ::14.642 Object11[:] static =
-- ::14.644 Object11[:] static =
-- ::14.644 Object11[:] static =
-- ::14.645 Object11[:] static =
-- ::14.645 Object11[:] static =

测试代码和结果

  从以上代码可以看出,调用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);
}

static 属性在方法中

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

@autoreleasepool {
for(int i=;i<;i++){
[Person hello];
}
} //测试结果
-- ::04.681 Object11[:] static =
-- ::04.683 Object11[:] static =
-- ::04.684 Object11[:] static =
-- ::04.685 Object11[:] static =
-- ::04.685 Object11[:] static =

测试代码和结果

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

#import "Person.h"

@implementation Person

@synthesize age;
@synthesize name; -(void) write
{
static int myage=;
myage++;
NSLog(@"年龄:%i",myage);
} +(void) hello
{
static int count;
count++;
NSLog(@"static = %i",count);
}

在实例方法中定义static属性

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

    @autoreleasepool {
for(int i=;i<;i++){
Person *p=[[Person alloc] init];
p.name=[NSString stringWithFormat:@" %@ %i",@"object c",i];
[p write];
}
} //测试结果如下
-- ::35.161 Object11[:] 姓名: object c 年龄:
-- ::35.163 Object11[:] 姓名: object c 年龄:
-- ::35.164 Object11[:] 姓名: object c 年龄:
-- ::35.164 Object11[:] 姓名: object c 年龄:
-- ::35.164 Object11[:] 姓名: object c 年龄:

测试代码

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

  3. 静态方法

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

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

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

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

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

Object C学习笔记10-静态方法和静态属性的更多相关文章

  1. Vue2.x源码学习笔记-Vue静态方法和静态属性整理

    Vue静态方法和静态属性,其实直接在浏览器中可以查看到的,如下 圈起来的是其静态属性,但是有的属性对象中的属性的值又是函数.未圈起来的则是函数. 其实它来自如下各个目录下的js文件 // src/co ...

  2. Object C学习笔记24-关键字总结

    学习Object C也有段时间了,学习的过程中涉及到了很多Object C中的关键字,本文总结一下所涉及到的关键字以及基本语法. 1.  #import #import <> 从syste ...

  3. Object C学习笔记24-关键字总结(转)

    学习Object C也有段时间了,学习的过程中涉及到了很多Object C中的关键字,本文总结一下所涉及到的关键字以及基本语法. 1.  #import #import <> 从syste ...

  4. Object C学习笔记17-动态判断和选择器

    当时学习Object C的时被人鄙视了一顿,说使用.NET的思想来学Object C就是狗屎:不过也挺感谢这位仁兄的,这让我学习的时候更加的谨慎.今天的学习笔记主要记录Object C中的动态类型相关 ...

  5. thinkphp学习笔记10—看不懂的路由规则

    原文:thinkphp学习笔记10-看不懂的路由规则 路由这部分貌似在实际工作中没有怎么设计过,只是在用默认的设置,在手册里面看到部分,艰涩难懂. 1.路由定义 要使用路由功能需要支持PATH_INF ...

  6. 并发编程学习笔记(10)----并发工具类CyclicBarrier、Semaphore和Exchanger类的使用和原理

    在jdk中,为并发编程提供了CyclicBarrier(栅栏),CountDownLatch(闭锁),Semaphore(信号量),Exchanger(数据交换)等工具类,我们在前面的学习中已经学习并 ...

  7. Spring 源码学习笔记10——Spring AOP

    Spring 源码学习笔记10--Spring AOP 参考书籍<Spring技术内幕>Spring AOP的实现章节 书有点老,但是里面一些概念还是总结比较到位 源码基于Spring-a ...

  8. Object C学习笔记22-#define 用法

    上一篇讲到了typedef 关键字的使用,可以参考文章 Object C 学习笔记--typedef用法 .而在c中还有另外一个很重要的关键字#define. 一. #define 简介 在C中利用预 ...

  9. Object C学习笔记21-typedef用法

    在上一章的学习过程中遇到了一个关键字typedef,这个关键字是C语言中的关键字,因为Object C是C的扩展同样也是支持typedef的. 一. 基本作用 typedef是C中的关键字,它的主要作 ...

随机推荐

  1. c# Windows Service 桌面上显示UI

    介绍 本文的目的是说明如何从Windows Vista中的服务正确启动交互式进程,以及演示如何以完全管理员权限启动该进程.交互式过程是能够在桌面上显示UI的过程. 本文介绍如何创建一个名为Loader ...

  2. SOAR平台初探(一)

    1.前言 Security Orchestration, Automation and Response(SOAR)安全编排和自动化响应,是Gartner2017年提出的新概念.Gartner预计到2 ...

  3. [BZOJ 5252][LOJ 2478][九省联考2018] 林克卡特树

    [BZOJ 5252][LOJ 2478][九省联考2018] 林克卡特树 题意 给定一个 \(n\) 个点边带权的无根树, 要求切断其中恰好 \(k\) 条边再连 \(k\) 条边权为 \(0\) ...

  4. JS BOM简列

    JS BOM BOM 也叫浏览器对象模型,它提供了很多对象,用于访问浏览器的功能.BOM 缺少规范,每个浏览器提供商又按照自己想法去扩展它,那么浏览器共有对象就成了事实的标准.所以,BOM 本身是没有 ...

  5. angularjs-$location

    $location服务分析浏览器地址栏中的URL(基于window.location),让我们可以在应用中较为方便地使用URL里面的内容.在地址栏中更改URL,会响应到$location服务中,而在$ ...

  6. React 异步组件

    之前写过一篇 Vue 异步组件的文章,最近在做一个简单项目的时候又想用到 React 异步组件,所以简单地了解了一下使用方法,这里做下笔记. 传统的 React 异步组件基本都靠自己实现,自己写一个专 ...

  7. mycat结合双主复制实现读写分离模式

    简介:应用程序仅需要连接mycat,后端服务器的读写分离由mycat进行控制,后端服务器数据的同步由MySQL主从同步进行控制. 本次实验环境架构图 服务器主机规划 主机名 IP  功能 备注 lin ...

  8. 【洛谷】【搜索(dfs)】P1363 幻想迷宫

    [题目描述:] 幻象迷宫可以认为是无限大的,不过它由若干个N*M的矩阵重复组成.矩阵中有的地方是道路,用'.'表示:有的地方是墙,用'#'表示.LHX和WD所在的位置用'S'表示.也就是对于迷宫中的一 ...

  9. 【洛谷】【动态规划(多维)】P1006 传纸条

    [题目描述:] 小渊和小轩是好朋友也是同班同学,他们在一起总有谈不完的话题.一次素质拓展活动中,班上同学安排做成一个m行n列的矩阵,而小渊和小轩被安排在矩阵对角线的两端,因此,他们就无法直接交谈了.幸 ...

  10. 【洛谷】【线段树+位运算】P2574 XOR的艺术

    [题目描述:] AKN觉得第一题太水了,不屑于写第一题,所以他又玩起了新的游戏.在游戏中,他发现,这个游戏的伤害计算有一个规律,规律如下 1. 拥有一个伤害串为长度为n的01串. 2. 给定一个范围[ ...