第07天OC语言(07):字符串基本概念

  • 不要等到明天,明天太遥远,今天就行动。

#####须读:看完该文章你能做什么?

字符串的几种创建方式以及存储位置 深拷贝 和 浅拷贝的基本概念

#####学习前:你必须会什么?(在这里我已经默认你具备C语言的基础了)

NSString的基本使用


#####一、本章笔记

 一、创建字符串对象(三种方式) 存储空间也不一样
     NSString *str1 = @"lyh";
     NSString *str2 = [[NSString alloc]initWithFormat:@"lyh"];
     NSString *str3 = [NSString stringWithFormat:@"lyh"];

 二、通过不同的方式创建字符串,字符串对象存储的位置也不一样
     >如果通过字符串常量创建, 那么字符串对象存储在常量区中
     >如果通过alloc initWithFormat / stringWithFormat 创建,那么字符串对象存储在 堆区中
     而且需要注意:
     >不同的平台存储的方式也不一样 , 如果是Mac平台 系统自动对字符串对象进行优化,但是iOS平台就是两个对象
     >不同的编译器存储的方式也不一样 ,  如果是Xcode6以下并且是在iOS平台,那么是两个对象,如果在Xcode6以上 那么alloc 多次指向 同一块存储空间
 三、
     一般情况下,只要通过alloc 或者 通过类工厂方法创建的对象,每次都会在堆内存中 开辟一块新的存储空间
     但是 如果是通过 alloc的initWithString方法除外,因为这个方法是通过copy返回一个字符串对象给我们
     而copy又分为 深拷贝和浅拷贝,
     如果是深拷贝 会创建一个新的对象,
     如果是浅拷贝 不会创建一个新的对象,而是直接返回被拷贝的对象的地址给我们
     而initWithFormat正好是浅拷贝,所以无论是在什么平台,什么编译器 都是指向同一块存储空间

#####二、code ######main.m

#pragma mark 07-字符串基本概念
#pragma mark 概念
/*
 一、创建字符串对象(三种方式) 存储空间也不一样
     NSString *str1 = @"lyh";
     NSString *str2 = [[NSString alloc]initWithFormat:@"lyh"];
     NSString *str3 = [NSString stringWithFormat:@"lyh"];

 二、通过不同的方式创建字符串,字符串对象存储的位置也不一样
     >如果通过字符串常量创建, 那么字符串对象存储在常量区中
     >如果通过alloc initWithFormat / stringWithFormat 创建,那么字符串对象存储在 堆区中
     而且需要注意:
     >不同的平台存储的方式也不一样 , 如果是Mac平台 系统自动对字符串对象进行优化,但是iOS平台就是两个对象
     >不同的编译器存储的方式也不一样 ,  如果是Xcode6以下并且是在iOS平台,那么是两个对象,如果在Xcode6以上 那么alloc 多次指向 同一块存储空间
 三、
     一般情况下,只要通过alloc 或者 通过类工厂方法创建的对象,每次都会在堆内存中 开辟一块新的存储空间
     但是 如果是通过 alloc的initWithString方法除外,因为这个方法是通过copy返回一个字符串对象给我们
     而copy又分为 深拷贝和浅拷贝,
     如果是深拷贝 会创建一个新的对象,
     如果是浅拷贝 不会创建一个新的对象,而是直接返回被拷贝的对象的地址给我们
     而initWithFormat正好是浅拷贝,所以无论是在什么平台,什么编译器 都是指向同一块存储空间
 */
#pragma mark - 代码
#import <Foundation/Foundation.h>
#pragma mark 类

#pragma mark - main函数
int main(int argc, const char * argv[])
{
    
    // 如何创建字符串对象
    
#pragma mark 1.通过不同的方式创建字符串,字符串对象存储的位置也不一样

    /*
        >如果通过字符串常量创建, 那么字符串对象存储在常量区中
        >如果通过alloc initWithFormat / stringWithFormat 创建,那么字符串对象存储在 堆区中
     而且需要注意:
        >不同的平台存储的方式也不一样 , 如果是Mac平台 系统自动对字符串对象进行优化,但是iOS平台就是两个对象
        >不同的编译器存储的方式也不一样 ,  如果是Xcode6以下并且是在iOS平台,那么是两个对象,如果在Xcode6以上 那么alloc 多次指向 同一块存储空间
     
     */
    // 1.通过字符串常量创建
    // 注意 :  如果通过字符串常量 创建字符串对象, 并且字符串常量的内容一致,那么如果创建多个字符串对象,对个对象指向同一块存储空间
    NSString *str1 = @"lyh";
    NSString *str11 = @"lyh";
    NSLog(@"str1 = %p,str11 = %p",str1,str11);  // str1 = 0x100001038,str11 = 0x100001038
    
    
    // 2.通过alloc init创建 (如果是Mac平台 系统自动对字符串对象进行优化)
    // 只要通过alloc 就会在堆内容中 开辟一块存储空间
    NSString *str2 = [[NSString alloc]initWithFormat:@"lyh"];
    NSString *str22 = [[NSString alloc]initWithFormat:@"lyh"];
    NSLog(@"str2 = %p,str22 = %p",str2,str22); // str2 = 0x68796c35,str22 = 0x68796c35

    // 3.通过类工厂方法创建 stringWithFormart
    // 内部其实 就是封装 alloc init
    NSString *str3 = [NSString stringWithFormat:@"lyh"];
    NSString *str33 = [NSString stringWithFormat:@"lyh"];
    NSLog(@"str3 = %p,str33 = %p",str3,str33); // str3 = 0x68796c35,str33 = 0x68796c35

    
    /*
     注意 : 一般情况下,只要通过alloc 或者 通过类工厂方法创建的对象,每次都会在堆内存中 开辟一块新的存储空间
        但是 如果是通过 alloc的initWithString方法除外,因为这个方法是通过copy返回一个字符串对象给我们
        而copy又分为 深拷贝和浅拷贝, 
     如果是深拷贝 会创建一个新的对象,
     如果是浅拷贝 不会创建一个新的对象,而是直接返回被拷贝的对象的地址给我们
        而initWithFormat正好是浅拷贝,所以无论是在什么平台,什么编译器 都是指向同一块存储空间
     */
    NSString *str4 = [[NSString alloc]initWithString:@"lyh"];
    NSString *str44 = [[NSString alloc]initWithString:@"lyh"];
    NSLog(@"str4 = %p,str44 = %p",str4,str44); // str4 = 0x68796c35,str44 = 0x68796c35
    return 0;
}

转载于:https://my.oschina.net/u/3561184/blog/1475111

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值