NSString 初始化方法的内存比较

NSString *str1 = @"hello";

NSString *str2 = @"hello";

NSString *str3 = [NSString stringWithFormat:@"hello"];

NSString *str4 = [NSString stringWithString:@"hello"];

NSString *str5 = [[NSString alloc]initWithString:@"hello"];

NSLog(@"%p //%p //%p // %p //%p",str1,str2,str3,str4,str4,str5);

0x92a88 //0x92a88 //0x796b96b0 // 0x92a88 //0x92a88

SSting的对象在使用@"xx"直接初始化赋值时,它会在内存"stack segment"中分配一个空间,用于保存该变量。
相同赋值的对象,会采用相同的内存空间,表现为内存地址相同。

可以理解为NSString的isa的值是一样的。

NSString *[email protected]"e中国2";
    NSString *[email protected]"e中国2";

// %p for pointers to show the memory address 
    NSLog(@"str2‘addr is %p str3‘addr is %p",str2,str3);

使用stringWithFormat:工厂方法初始化NSString对象时,每次都独立分配内存空间。
我怀疑这个空间是在heap segment中,而不是stack segment中。    
即使相同内容的NSString对象,通过%d获取的对象的内存地址的值不一致。
    
    NSString *str2=[NSString stringWithFormat:@"e中国%i",2];
    NSString *str3=[NSString stringWithFormat:@"e中国%i",2];

// %p for pointers to show the memory address 
    NSLog(@"str2‘addr is %p str3‘addr is %p",str2,str3);

NSString的比较方法,比较内容应该是isEqualToString:,比较指针的是==比较符号。通常情况下,你需要比较的都会是内容本身而不是其指针值。

时间: 2024-10-07 01:14:15

NSString 初始化方法的内存比较的相关文章

NSString初始化及其内存管理

1. NSString 3种初始化方法 a. 直接赋值: NSString *str = @"a string", 这种方式使用常量内存. b. 使用类方法: NSString *str = [NSString stringWithString:@"a string"];    NSString * str = [NSString stringWithFormat:@"age is %i, height is %f", 20, 180]; c.

七.OC基础加强--1.内存管理 2.野指针,内存泄露 3.set方法的内存管理 [email protected]参数 [email protected]和循环retain的使用 6.NSString的内存管理

1,内存管理简单介绍 1,为什么要有内存管理? malloc selloc dealloc```需要回头复习 一般的内存 4s 是512m内存:6 是1024m内存: 当内存过大时,会耗尽内存.出现程序闪退. 2.OC内存管理的范围 : 管理任何继承NSObject的对象,对其他的基本数据类型无效. 3.对象类型是程序运行过程中动态分配的,存储在堆区:内存管理主要是对 堆区中的对象的内存管理. 4.OC内存管理的原理 为了防止内存泄露 对象的引用计数器 : 每个OC对象都有自己的引用计数器,是一

OC中的类簇的使用和初始化方法中属性的使用

今天遇到了几个和字符串相关的内存问题,和大家分享一下 NSString *name = [[NSString alloc]initWithString:@"张三"];NSLog(@"%d",[name retainCount]); 这两行代码的打印结果是-1, NSString * aString = [[NSString alloc] initWithFormat:@"123"]; NSLog(@"%d",aString.r

OC设置器与访问器以及自定义初始化方法

1.Person.h #import <Foundation/Foundation.h> @interface Person : NSObject { NSString * _name; NSString * _sex; NSInteger  _age; CGFloat    _weight; CGFloat    _height; } - (void)sayhi; //设置器   专门给一个实例变量赋值的方法 - (void)setName:(NSString *)name; - (void

OC中的属性、方法及内存管理

普通方法:关注(代表)对象可以”干什么”,过程中需要实例变量.-(void)show;输出 … 访问属性    属性:属性专门处理实例变量.(程序执行过程当中)    初始化方法:一创建对象(第一时间),给实例变量赋值.    工厂方法:只一个方法,帮我们解决创建对象问题.初始化对象的问题.工厂方法创建对象最简单.(对象达到一定量级) 补:在类方法中,可以调用类中创建的实例的实例方法或实例变量. 算法.设计模式:是人们总结的一种规律,一种思想. 1.单例模式    是一种特殊的工厂方法.    

Objective-C学习笔记_继承、初始化方法、便利构造器

一.继承 继承的上层:父类,继承的下层:子类.继承是单向的,不能相互继承.继承具有传递性:A继承于B,B继承于C,A具有B和C的特征和?为.子类能继承父类全部的特征和行为. 例题 打僵尸.需求: 1.定义普通僵尸类: 实例变量:僵尸总血量.僵尸每次失血量. 方法:初始化方法(总血量).被打击失血.死亡. 2.定义路障僵尸类: 实例变量:僵尸总血量.僵尸每次失血量,道具,弱点. 方法:初始化方法(总血量).被打击失血.失去装备.死亡. 3.定义铁桶僵尸类: 实例变量:僵尸总血量.僵尸每次失血量,道

UI 指派初始化方法 视图控制器 button响应方法

1 #import "MainViewController.h" 2 3 @interface MainViewController () 4 // 延展 :管理类私有的属性和方法 5 @end 6 7 @implementation MainViewController 8 // 指派初始化方法 9 - (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil 10 { 11 self

数组的初始化方法

//数组的初始化方法 # include<stdio.h> # include<stdlib.h> int main() { int a[3][4]; int num = 0; //方法一: /* for (int i = 0; i < 3 * 4; i++) { a[i / 4][i % 4] = num; num++; } */ //方法二: /* printf("start...\n"); for (int *p = &a[0][0]; p

oc知识点 初始化方法

一继承 继承是面向对象编程的三大特性之一 ,继承既能保证类的完整,又能简化代码 1 没有父类的类称为根类 oc中的根类NSObject 2继承内容:所有的实例变量和方法 3继承是单向的,不能相互继承 4继承具有传递性 5如果子类不满意父类的方法实现可以重写父类的方法 二 super self super 是编译器指令,并非对象    给super发消息可以执行父类方法的实现 self 是系统关键字 self在方法中指带当前的调用者 三 初始化方法 创建对象分为两步: 1为对象开辟空间 2进行初始