0
点赞
收藏
分享

微信扫一扫

objectiveC【语法】修饰符 static extern const 详解


如题:  static NSString * const kMASCellReuseIdentifier = @"kMASCellReuseIdentifier";

const


const最好理解,修饰的东西不能被修改


指针类型根据位置的不同可以理解成3种情况:


I 常量指针

// 初始化之后不能赋值,指向的对象可以是任意对象,对象可变。 

 

  NSString * const pt1; 

 
 
 
 
II 指向常量的指针
 

  // 初始化之后可以赋值,即指向别的常量,指针本身的值可以修改,指向的值不能修改 

 

  const NSString * pt2; 
 
 
 
 
 
III 指向常量的常量指针
 

  const NSString *  const pt3; 
 
 
 
 
 
extern
 

  等同于c, 
 全局变量的定义, 

 

  //x .h 声明 

 

  extern const NSString * AA; 

 
 
 
 

  //x .m 定义 

 

  const NSString * AA = @"abc"; 

 
 
 
 

  // 调用 

 

  #import "x.h"


或者再次申明


extern const NSString * AA;


static


等同于c,将变量的作用域限定于本文件?

不同于java C++里面的 类变量,oc没有类变量



疑问



1. static const NSString * const ChatWindow_STR_TITLE_INDEX[] = {  
2. "msg_type_all",   
3. "msg_type_area",   
4. "msg_type_PM",   
5. "msg_type_team",  
6. "guild_title",  
7. "msg_type_system",  
8. "msg_type_world"  
9. };



我在.h文件里定义一个static变量,


I .h初始化

在不同的.m里调用都有值,这些值是否同一个对象?

【不同的对象】

II .m里初始化(or赋值)

初始化的值只在.m文件里有效果,即等同于c,将变量的作用域限定于本文件

其他.m文件调用的值都没有赋值。

【不同的对象】

结论

static

// static变量属于本类,不同的类对应的是不同的对象
 
    // static变量同一个类所有对象中共享,只初始化一次

const


// static const变量同static的结论I,只是不能修改了,但是还是不同的对象
    // extern const变量只有一个对象,标准的常量的定义方法
    // extern的意思就是这个变量已经定义了,你只负责用就行了


Objective-C里核心的处理字符串的类就是NSString和NSMutableString这两个类,这两个类完成了Objective-C中字符串大部分功能的处理。这两个类的最主要的区别是NSString创建赋值后不能动态修改长度和内容,除非给重新赋值。而NSMutableString类似与链表的,在创建赋值后可以进行修改长度,插入,删除等操作。

注:以下代码运行环境是:XCode 4.3.2 ,IOS 5.1。

NSString提供了许多创建和初始化新字符串的方法。下面这个是创建常量字符串的。 它是编译到可执行文件中的NSString的实例,它不会在内存中消失。例子:

1、创建常量字符串。

我是字符串";

2、NSString的内存地址


当我们声明一个字符串时,NSString *aString;


变量aString并不是真正包含一个字符串对象,它是指向内存中字符串对象的指针,我们称之为对象标识符,因为它是表示内存中的一个对象而不是保存这个对象,指针是一个内存位置的地址,下面考虑用“==”来比较字符串,来看个例子


NSString *string1 = @"我是甲一号";
NSString *string2 = @"我是甲一号";
BOOL
if(result){
NSLog(@"address:%p", string1);
NSLog(@"address:%p", string2);
         }

运行打印结果:

2012-07-30 09:36:41.337 objectiveC[613:403] yiyang:0x10485b478

2012-07-30 09:36:41.339 objectiveC[613:403] yiyang:0x10485b478

说明result的值是YES,这里对比的是内存地址,@"我是甲一号"存储在文字常量区,string1和string2都指向这个字符串,所以指向的是同一个地址。


如果这样做

NSString *string1 = @"我是甲一号"; 

NSString *string2 = string1; 

BOOL result = string1==string2;

这时候result的值也YES了

看个例子就明白了。下面是字符串内存地址的例子


1. //内存指向  
2. "我是字符串";  
3.   NSString *astring = [[NSString alloc] init];  
4. "astring point address:0x%.8x", astring);  
5. "bstring point address:0x%.8x", bstring);  
6. "我是字符串";  
7. "重新赋值之后的astring point address:0x%.8x", astring);  
8. "astring:%@",astring);

打印结果如下:



1. 2012-06-14 11:35:31.226 NSString[2316:f803] astring point address:0x00b72a7c  
2. 2012-06-14 11:35:31.227 NSString[2316:f803] bstring point address:0x000045bc  
3. 2012-06-14 11:35:31.227 NSString[2316:f803] 重新赋值之后的astring point address:0x000045bc  
4. 2012-06-14 11:35:31.227 NSString[2316:f803] astring:我是字符串

重新赋值后,astring 的地址和bstring地址一样了。



举报

相关推荐

0 条评论