objectiveC【语法】修饰符 static extern const 详解
2015-12-30 16:10
519 查看
如题: static
NSString *
const kMASCellReuseIdentifier =
@"kMASCellReuseIdentifier";
const
const最好理解,修饰的东西不能被修改
指针类型根据位置的不同可以理解成3种情况:
NSString * const pt1;
const NSString * pt2;
//x .h 声明
extern const NSString * AA;
//x .m 定义
const NSString * AA = @"abc";
// 调用
#import "x.h"
或者再次申明
extern const NSString * AA;
不同于java C++里面的类变量,oc没有[b]类变量[/b]
plaincopy
static const NSString * const ChatWindow_STR_TITLE_INDEX[] = {
@"msg_type_all",
@"msg_type_area",
@"msg_type_PM",
@"msg_type_team",
@"guild_title",
@"msg_type_system",
@"msg_type_world"
};
我在.h文件里定义一个static变量,
【不同的对象】
其他.m文件调用的值都没有赋值。
【不同的对象】
// static变量同一个类所有对象中共享,只初始化一次
// extern const变量只有一个对象,标准的常量的定义方法
// extern的意思就是这个变量已经定义了,你只负责用就行了
Objective-C里核心的处理字符串的类就是NSString和NSMutableString这两个类,这两个类完成了Objective-C中字符串大部分功能的处理。这两个类的最主要的区别是NSString创建赋值后不能动态修改长度和内容,除非给重新赋值。而NSMutableString类似与链表的,在创建赋值后可以进行修改长度,插入,删除等操作。
注:以下代码运行环境是:XCode 4.3.2 ,IOS 5.1。
NSString提供了许多创建和初始化新字符串的方法。下面这个是创建常量字符串的。 它是编译到可执行文件中的NSString的实例,它不会在内存中消失。例子:
1、创建常量字符串。
NSString *astring = @"我是字符串";
2、NSString的内存地址
当我们声明一个字符串时,NSString *aString;
变量aString并不是真正包含一个字符串对象,它是指向内存中字符串对象的指针,我们称之为对象标识符,因为它是表示内存中的一个对象而不是保存这个对象,指针是一个内存位置的地址,下面考虑用“==”来比较字符串,来看个例子
NSString *string1 = @"我是甲一号";
NSString *string2 = @"我是甲一号";
BOOL result = string1==string2;
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了
看个例子就明白了。下面是字符串内存地址的例子
[cpp] view
plaincopy
//内存指向
NSString *bstring = @"我是字符串";
NSString *astring = [[NSString alloc] init];
NSLog(@"astring point address:0x%.8x", astring);
NSLog(@"bstring point address:0x%.8x", bstring);
astring=@"我是字符串";
NSLog(@"重新赋值之后的astring point address:0x%.8x", astring);
NSLog(@"astring:%@",astring);
打印结果如下:
[cpp] view
plaincopy
2012-06-14 11:35:31.226 NSString[2316:f803] astring point address:0x00b72a7c
2012-06-14 11:35:31.227 NSString[2316:f803] bstring point address:0x000045bc
2012-06-14 11:35:31.227 NSString[2316:f803] 重新赋值之后的astring point address:0x000045bc
2012-06-14 11:35:31.227 NSString[2316:f803] astring:我是字符串
重新赋值后,astring 的地址和bstring地址一样了。
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没有[b]类变量[/b]
疑问
[cpp] viewplaincopy
static const NSString * const ChatWindow_STR_TITLE_INDEX[] = {
@"msg_type_all",
@"msg_type_area",
@"msg_type_PM",
@"msg_type_team",
@"guild_title",
@"msg_type_system",
@"msg_type_world"
};
我在.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、创建常量字符串。
NSString *astring = @"我是字符串";
2、NSString的内存地址
当我们声明一个字符串时,NSString *aString;
变量aString并不是真正包含一个字符串对象,它是指向内存中字符串对象的指针,我们称之为对象标识符,因为它是表示内存中的一个对象而不是保存这个对象,指针是一个内存位置的地址,下面考虑用“==”来比较字符串,来看个例子
NSString *string1 = @"我是甲一号";
NSString *string2 = @"我是甲一号";
BOOL result = string1==string2;
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了
看个例子就明白了。下面是字符串内存地址的例子
[cpp] view
plaincopy
//内存指向
NSString *bstring = @"我是字符串";
NSString *astring = [[NSString alloc] init];
NSLog(@"astring point address:0x%.8x", astring);
NSLog(@"bstring point address:0x%.8x", bstring);
astring=@"我是字符串";
NSLog(@"重新赋值之后的astring point address:0x%.8x", astring);
NSLog(@"astring:%@",astring);
打印结果如下:
[cpp] view
plaincopy
2012-06-14 11:35:31.226 NSString[2316:f803] astring point address:0x00b72a7c
2012-06-14 11:35:31.227 NSString[2316:f803] bstring point address:0x000045bc
2012-06-14 11:35:31.227 NSString[2316:f803] 重新赋值之后的astring point address:0x000045bc
2012-06-14 11:35:31.227 NSString[2316:f803] astring:我是字符串
重新赋值后,astring 的地址和bstring地址一样了。
相关文章推荐
- Objective-C中的单例模式(singleton)
- Effective objective-C 2.0总结归纳
- Objective-C学习篇第十弹:NSDate详解
- Objective-c语言_面向对象(便利初始化函数,构造器和多态的结合)
- ASP.NET MVC - Passing anonymous objects to MVC views and accessing them using dynamic
- Ownership of Container Object
- Objective-c语言_面向对象(多态)2
- [1]姥爷幽默谈Objective-C(Objective-C起源,对象,类,方法)
- NSObject易误解处
- Object源码后记
- Objective-c与js相互调用
- JSONArray.fromObject()注入处理日期Date格式
- SQL Server系统表sysobjects介绍与使用
- IOS开发系列----Objective-c的内存管理
- #Objective - C - UI-design - 第一天 -UIKit框架-UIKit-UIView
- java中Object源码分析
- gcc报错 can not be used when making a shared object; recompile with -fPIC
- 【Objective-C学习记录】第二十八天
- java JsonObject的用法以及map总同一个key,但是不同的value,如何存储的问题
- ASP.NET MVC - Redirect-and-Post-JSON-Object-in-ASP-NET-MVC