都已经进入arc的时代了,不用写一堆代码去管理内存了
但是arc还是不如java的gc好使
但是arc还是不如java的gc好使
解决方案 »
- 有没有宏可以区别debug模式和release模式?
- 怎样搭建winXP上的iphone模拟平台?
- 这样一个需求怎么开发IOS客户端呢。
- 求iphone手机里原有的时钟软件
- 如何将一个struct添加到NSMutableArray中
- BMKMapManager.h 提示: Expected identifier or '('
- iOS 7 如何实现tabbar 放在顶上
- 输入的不是有效的 Base-64 字符串,因为它包含非 Base-64 字符、两个以上的填充字符,或者填充字符间包含非法字符。
- iOS开发uidocumentinteractioncontroller的问题
- CCb是什么
- 为自定义Toolbar设置的背景图片只覆盖了一部分?
- iOS 模拟器设置中地区改为中国,但是获取的地区字符串依然是美国的en_us,这个要怎么解决
例如:const char* s = "abc";这里的"abc"又叫作魔数,仿佛像魔法一样出现的...
其实编译器,在程序的全局数据区,分配了4个字节的空间,并填充'a','b','c',0
我们调试时,也可以看到,指针s是有数值的,它指向的就是这4个空间首地址....我更同意版主说的,它其实是一个自动释放对象...
类似于[NSString stringWithXXXXX];这一系列函数产生的对象..验证也很简单int i = [@"abc" length];它可以调用函数,说明它是对象...上面c++仁兄提到的,c++字面常量,,你给我调一下它的函数试试????
//它是没有函数滴
int i = "abc".size();
只不过你可以认为它是autorelease的,所以不用自己来释放...
例如:const char* s = "abc";这里的"abc"又叫作魔数,仿佛像魔法一样出现的...
其实编译器,在程序的全局数据区,分配了4个字节的空间,并填充'a','b','c',0
我们调试时,也可以看到,指针s是有数值的,它指向的就是这4个空间首地址....我更同意版主说的,它其实是一个自动释放对象...
类似于[NSString stringWithXXXXX];这一系列函数产生的对象..验证也很简单int i = [@"abc" length];它可以调用函数,说明它是对象...上面c++仁兄提到的,c++字面常量,,你给我调一下它的函数试试????
//它是没有函数滴
int i = "abc".size();
只不过你可以认为它是autorelease的,所以不用自己来释放...哈哈,你在研究研究吧
例如:const char* s = "abc";这里的"abc"又叫作魔数,仿佛像魔法一样出现的...
其实编译器,在程序的全局数据区,分配了4个字节的空间,并填充'a','b','c',0
我们调试时,也可以看到,指针s是有数值的,它指向的就是这4个空间首地址....我更同意版主说的,它其实是一个自动释放对象...
类似于[NSString stringWithXXXXX];这一系列函数产生的对象..验证也很简单int i = [@"abc" length];它可以调用函数,说明它是对象...上面c++仁兄提到的,c++字面常量,,你给我调一下它的函数试试????
//它是没有函数滴
int i = "abc".size();
只不过你可以认为它是autorelease的,所以不用自己来释放...哈哈,你在研究研究吧兄弟,如果你觉得我语气,哪里有羞辱了你的尊严的话,我向你道歉..
但就c/c++,objc语言知识层面上来说,我还是坚持:
@"abc"是自动释放对象;
"abc"才是字面常量....因为确实是//它有函数
int i = [@"abc" length];
//它没有函数
int i = "abc".size();
只不过@"abc"和"abc"关联很大.后面我又写了代码:
-(IBAction)onBtn1:(id)sender {
const char* s = "0123456789abcdef";
NSString* ns = @"0123456789abcdef";
std::string stds = "0123456789abcdef";
char* p = (char*)s;
char* np = (char*)[ns UTF8String];
char* stdp = (char*)stds.c_str();
printf("%lld: %lld: %lld\n", p, np, stdp);
//p[1] = '3'; //注意,前面2行代码运行崩溃.说明不能修改全局数据区.
//np[1] = '3';
stdp[1] = '3'; //而行代码可以运行.说明std::string已经重新分配了空间,没有再指向全局数据区了.
}
这个按钮,在调试时,无论你什么时候点击,无论你点击多少次..输出都是相同的:
4294977008: 4294977008: 140734799801969
4294977008: 4294977008: 140734799801969
4294977008: 4294977008: 140734799801969
4294977008: 4294977008: 140734799801969
4294977008: 4294977008: 140734799801969
4294977008: 4294977008: 140734799801969
4294977008: 4294977008: 140734799801969
4294977008: 4294977008: 140734799801969
========================================
再来看另外一个按钮-(IBAction)onBtn2:(id)sender {
int i = 200; //注意,它跟前面的区别是,栈里面多了一个变量.
const char* s = "0123456789abcdef";
NSString* ns = @"0123456789abcdef";
std::string stds = "0123456789abcdef";
char* p = (char*)s;
char* np = (char*)[ns UTF8String];
char* stdp = (char*)stds.c_str();
printf("%lld: %lld: %lld\n", p, np, stdp);
}
它的输出为:
4294977008: 4294977008: 140734799801961
4294977008: 4294977008: 140734799801961
4294977008: 4294977008: 140734799801961
4294977008: 4294977008: 140734799801961
4294977008: 4294977008: 140734799801961
4294977008: 4294977008: 140734799801961
4294977008: 4294977008: 140734799801961
4294977008: 4294977008: 140734799801961我们可以看到,第三列有所不同..
特别说明的是:
140734799801969和140734799801961相差8,刚好是栈元素的大小(mac 64位下)……
========================================
为了说明,为何上面相差的是8,我们看另外一个按钮
-(IBAction)onBtn3:(id)sender {
const char* s = "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef";
NSString* ns = @"0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef";
std::string stds = "0123456789abcdef0123456789abcdef0123456789abcdef0123456789abcdef";
char* p = (char*)s;
char* np = (char*)[ns UTF8String];
char* stdp = (char*)stds.c_str();
printf("%lld: %lld: %lld\n", p, np, stdp);
}它的输出为:
4294977043: 4294977043: 105553116809424
4294977043: 4294977043: 105553116810624
4294977043: 4294977043: 106102872629072
4294977043: 4294977043: 106102872609232
4294977043: 4294977043: 105553116810624
4294977043: 4294977043: 105553116810384
4294977043: 4294977043: 105553116810624
4294977043: 4294977043: 105553116810624
4294977043: 4294977043: 105553116810944我们发现,第三列变化可大了.这是为什么呢?
这跟std::string的实现方式有关.
我看过标准C++的源代码(MS的),为了说明题,我把std::string简化为如下:
class string {
//其他函数,成员等忽略,我们只看,存储数据部分
//... ...
//在微软的实现中,存储数据有2个地方
//当数据小于16时,把数据直接放在数组buf中;
//当数据大于16时,通过malloc,realloc等分配堆空间,并由指针ptr指向...
//阀值16,可能是那些研究员觉得即不会大量浪费空间,而日常中又大概率出现小于16的字符串,从而避免频繁使用malloc,free的情形,提高了效率...
char buf[16];
char* ptr;
};========================================
我看过objc的运行时库源代码,其中对id的声明如下:
struct objc_class {
Class isa OBJC_ISA_AVAILABILITY;#if !__OBJC2__
Class super_class OBJC2_UNAVAILABLE;
const char *name OBJC2_UNAVAILABLE;
long version OBJC2_UNAVAILABLE;
long info OBJC2_UNAVAILABLE;
long instance_size OBJC2_UNAVAILABLE;
struct objc_ivar_list *ivars OBJC2_UNAVAILABLE; //参数链表
struct objc_method_list **methodLists OBJC2_UNAVAILABLE; //方法链表
struct objc_cache *cache OBJC2_UNAVAILABLE; //缓存链表
struct objc_protocol_list *protocols OBJC2_UNAVAILABLE; //协议链表
#endif} OBJC2_UNAVAILABLE;typedef struct objc_class *Class;
typedef struct objc_object {
Class isa;
} *id;
可以看出objc对象,指向的是一个c的结构体.除了基本的名称,版本,大小之类的信息外,还有参数,方法,缓存,协议的链表.
用以支撑objc的正常工作.比如函数调用:
[s UTF8String];
就是从方法链表里面查找出相应的方法,然后调用
objc_msgSend对于NSString,除了上面提到的objc_class成员外,还有其他的,其中一个可能就如果std::string的char* ptr指向或分配一段数据....
这个没有看过源代码....