- 不要等到明天,明天太遥远,今天就行动。
须读:看完该文章你能做什么?
字符串的几种创建方式以及存储位置
深拷贝 和 浅拷贝的基本概念
学习前:你必须会什么?(在这里我已经默认你具备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;
}