都已经进入arc的时代了,不用写一堆代码去管理内存了
但是arc还是不如java的gc好使

解决方案 »

  1.   

    arc 吧! 这些都不用关心了!
      

  2.   

    @“abc”是字面值常量,和代码一起放在代码段。你的代码是将你的a指针(指向对象的指针)指向@“abc”。不会alloc分配堆内存(alloc开辟一块堆内存供对象使用)。所以这段内存你不用管。
      

  3.   

    程序写多了,arc会把你坑得直哭。
      

  4.   

    我认为oc中@"abc"不是字面值常量...跟c++的"abc"还是有本质区别的..
    例如: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的,所以不用自己来释放...
      

  5.   

    我认为oc中@"abc"不是字面值常量...跟c++的"abc"还是有本质区别的..
    例如: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的,所以不用自己来释放...哈哈,你在研究研究吧
      

  6.   

    我认为oc中@"abc"不是字面值常量...跟c++的"abc"还是有本质区别的..
    例如: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指向或分配一段数据....
    这个没有看过源代码....