黑马程序员技术交流社区

标题: NSString内存管理 [打印本页]

作者: SUPERREN_Hao    时间: 2016-1-14 15:46
标题: NSString内存管理
//
//  main.m
//  NSString的内存管理
//
//  Created by Markrry-hao on 16/1/4.
//  Copyright © 2016年 mac. All rights reserved.
//

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {

        int m =10;//m是一个变量 int类型的,局部变量,存方法在内存的 栈区
        NSLog(@"m= %p",&m);
        //栈区内存是从大往下分配的,堆区,从小往上分配

        char *s = "abc";
        NSLog(@"s = %p",s);//在常量区

        //第一种情况,@"字符串";,是oc中产量字符串,保存到常量区
        NSString *str = @"abc";
        NSLog(@"str = %@,addr = %p",str,str);

        //警告 [NSString stringWithString:@"abc"];替换成@"abc";
        //str1 ->str;
        //2.stringWithString 生成的字符串也是在常量区存储的
        NSString *str1 = [NSString stringWithString:@"abc"];
        NSLog(@"str1 = %@,addr = %p",str1,str1);

        //3,str存放在内存的堆区
//         在Xcodo 6.4下,字符串内容 abc 引用计数为1
//          在Xcodo 7下,字符串内容 abc 引用计数为无符号long类型的最大值
//                        字符串内容 abc加中文,引用计数为1
        NSString *str2 = [NSString stringWithFormat:@"abc"];
        NSLog(@"str2 = %@,addr = %p",str2,str2);

        //4,并没有产生新空间,存放在内存常量区
        NSString *str3 = [[NSString alloc]initWithString:@"abc"];
         NSLog(@"str3 = %@,addr = %p",str3,str3);

        //5,str4initWithFormat也是在内存的堆区存放
        NSString *str4 = [[NSString alloc]initWithFormat:@"sss"];
        NSLog(@"str4 = %@,addr = %p",str4,str4);

        //6,str5 比较特殊,在栈区生成,并不是在堆区
        NSString *str5 =[[NSString alloc]init];
        NSLog(@"str5 = %@,addr = %p",str5,str5);

    }
    return 0;
}







欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2