OC9_字符串的内存管理

//
//  main.m
//  OC9_字符串的内存管理
//
//  Created by zhangxueming on 15/6/18.
//  Copyright (c) 2015年 zhangxueming. All rights reserved.
//

#import <Foundation/Foundation.h>

//字符串内存管理, retainCount的值可以不参考, 只需要遵守内存管理法则就行
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSString *str1 = @"hello world";
        NSLog(@"str1 retainCount = %li", str1.retainCount);
        NSString *str2 = [NSString stringWithString:str1];
        NSLog(@"str2 retainCount = %li", str2.retainCount);
        NSString *str3 = [[NSString alloc] initWithString:str1];
        NSLog(@"str3 retainCount = %li",str3.retainCount);

        NSLog(@"str1 = %p str2 = %p str3 = %p", str1, str2, str3);
        [str3 release];

        NSString *str4 = [str3 retain];
        NSLog(@"str4 retainCount = %li", str4.retainCount);
        [str4 release];

        NSString *str5 = [str4 copy];
        NSLog(@"str5 retainCount = %li", str5.retainCount);
        NSLog(@"str5 = %p str4 = %p", str5, str4);
        [str5 release];

        NSMutableString *mulStr1 = [[NSMutableString alloc] initWithString:str5];
        NSLog(@"mulStr1 retainCount = %li", mulStr1.retainCount);
        NSLog(@"mulStr1 = %p str5 = %p", mulStr1, str5);

        NSMutableString *mulStr2 = [mulStr1 retain];
        NSLog(@"mulStr2 retainCount = %li", mulStr2.retainCount);

        NSString *str6 = [[NSString alloc] initWithString:mulStr1];
        NSLog(@"str6 retainCount = %li", str6.retainCount);

        NSString *str7 = [[NSString alloc] init];//@""
        NSLog(@"str7 retainCount = %li", str7.retainCount);

        NSLog(@"str6 = %p str7 = %p", str6, str7);

        NSString *str8 = [str7 stringByAppendingString:@"qian feng"];

        NSLog(@"str8 retainCount = %li", str8.retainCount);
        NSLog(@"str8 = %p", str8);

        [str6 release];
        [str7 release];
        [mulStr1 release];
        [mulStr2 release];
    }
    return 0;
}
时间: 2024-10-11 05:14:17

OC9_字符串的内存管理的相关文章

iOS开发-内存管理

内存管理 对于这篇呢,其实现在都是ARC模式,正常状态下基本不用我们去手动释放内存,所以如果不是要面试呀.装逼或者扎实功底的,就先别看了或者了解下即可,因为像面试时,有些面试官想看你的基础时,就有些人会问,现在工作基本不会用到. 学习目标 1. 掌握内存管理的原理 2. 掌握手动内存管理 =============================================== 1.需要理解的知识 1.1内存管理 1.1.1 C的内存管理,以及麻烦之处 char *p = (char *)m

OC语言--内存管理

1.内存管理原理的介绍 1.1C的内存管理 char *p = (char *)malloc(100*sizeof (char)); 这是C的动态内存分配,我们手动跟系统申请了100个字节的内存:或者说系统在堆里开辟了100个字节的空间,并将这个空间的首地址返回给指针变量p. strcpy(p,"Hello World!"); 将字符串拷贝给指针变量p指向的内存空间. puts(p); 将p指针指向的内存空间里的字符串打印出来. free(p); 使用完成后,手动跟系统释放内存空间:或

iOS开发之oc(十一)--内存管理MRC

掌握内容 >理解内存管理的原理 >掌握手动内存管理MRC >掌握内存管理在实际工程中的使用 (一) 1.理解部分 1.1内存管理 (传统内存管理demo) 1.1.1内存管理做了一件什么事? 内存管理就是确保开辟的堆空间得到正确的释放 如果堆空间没有释放,称为内存泄露 使用已释放的堆空间,称为提前释放 重复释放同一个空间,称为重复释放 1.1.2传统内存管理的困境 (1)当我们要释放一个堆,首先要确定使用这个堆的指针,都访问完毕,避免提前释放. (2)释放指针指向的堆空间,首先要确定那些

objective-c内存管理模块

objective-c可以全自动的实现程序的内存管理,主要是依赖于objective-c中引用计数的管理机制 首先: 内存管理的准则是:如果对一个对象使用了A类. alloc,[mutable]copy[withZone],retaion那么你必须使用相应的B类.release 或者 autorelease 解释:即每次程序中使用了A类的关键字,就需要对应使用B类的关键字释放对象内存. 1.数组的内存管理 一个对象声明,该对象的retainCount = 1;当将该对象添加到一个可变数组中的时候

内存管理知识点总结

一.内存区域分类: 1.堆区:需要的时候系统会为你分配内存,但是系统不会自动回收,需要程序员手动释放内存 2.栈区:需要的时候系统会为你分配内存,不需要的时候系统自动回收该内存 3.常量区:存储常量,数据不能修改 4.全局,静态区:存储全局变量和静态变量 5.自由存储区 二.注意: 1.内存管理只针对继承NSObject的对象,对其他基本数据类型无效(int double NSRange等) 2.mac OS 有垃圾回收机制,但iOS没有,其内存管理需要开发者处理 3.内存管理的目的:保证每个对

Obstack是C标准库里面对内存管理的GNU扩展

Obstack介绍 Obstack初始化 在Obstack中申请对象 释放对象 申请growing object 获取Obstack状态 数据对齐 以下是来自wiki对obstack的介绍: Obstack是C标准库里面对内存管理的GNU扩展(实际上就是GNU C library了).Obstack===Object stack.没错,Obstack就是一个栈,栈里面的元素是对象object(不是面向对象的对象哦,这里的对象单指数据元素).这些数据是动态的,也就是使用的是动态内存.这种内存管理技

OC内存管理

OC内存管理 一.基本原理 (一)为什么要进行内存管理. 由于移动设备的内存极其有限,所以每个APP所占的内存也是有限制的,当app所占用的内存较多时,系统就会发出内存警告,这时需要回收一些不需要再继续使用的内存空间,比如回收一些不再使用的对象和变量等. 管理范围:任何继承NSObject的对象,对其他的基本数据类型无效. 本质原因是因为对象和其他数据类型在系统中的存储空间不一样,其它局部变量主要存放于栈中,而对象存储于堆中,当代码块结束时这个代码块中涉及的所有局部变量会被回收,指向对象的指针也

OC -内存管理

管理内存有三种方式 1:垃圾回收,在java中常见的管理内存方法,系统自动检测对象是否被使用,是否被释放 2.MRC: 手动管理引用计数,iOS管理内存的方式,程序员通过手动方式来管理对象是否被释放 3.ARC: 自动管理引用计数:基于MRC,系统自动的管理内存 引用计数:retainCount 当我们使用一个指针指向一块内存的时候,应该对这块内存做retain操作,引用计数+1.当我们不再使用这个指针指向这块内存,应该对这块内存做release操作,引用计数-1.这样可以使引用计数值一直保持等

linux内核探索之内存管理(二):linux系统中的内存组织--结点、内存域和页帧

本文主要参考<深入linux内核架构>(3.2节)及Linux3.18.3内核源码 概述:本文主要描述了内存管理相关的数据结构:结点pg_data_t.内存域struct zone以及页帧(物理页):struct page ,以及该结构相关的一些基本概念. 1. 概述 内存划分为接点,每个结点关联到系统中的一个处理器,在内核中表示为pg_data_t. 各个结点又划分为内存域,比如DMA内存域,高端内存域,普通内存域. 内核内存域的宏: enum zone_type { #ifdef CONF