Objective-C:MRC(引用计数器)在OC内部的可变对象是适用的,不可变对象是不适用的(例如 NSString、NSArray等)

引用计数和字符串

内存中的常量字符串的空间分配与其他对象不同,他们没有引用计数机制

凡是自定义的对象都有引用计数机制;

OC内部中对象分为可变对象(NSMutableString等)和不可变对象(NSString、NSArray等),

不可变对象不适用于引用计数的机制,可变的对象适用引用计数机制。

 1 //  main.m
 2 //  03-unmutableobject
 3 //
 4 //  Created by ma c on 15/8/13.
 5 //  Copyright (c) 2015年 bjsxt. All rights reserved.
 6 //
 7
 8 #import <Foundation/Foundation.h>
 9
10 int main(int argc, const char * argv[])
11 {
12     @autoreleasepool
13     {
14         //不可变对象不适用于引用计数
15         //1.创建3个对象
16         NSString *str1 = @"hello world";//不可变对象
17
18         NSString *str2 = [NSString stringWithString:@"how arer you"];//不可变对象
19
20         NSMutableString *str3 = [NSMutableString stringWithString:@"I am fine"];//可变对象
21
22         NSLog(@"str1 = %lu,str2 = %lu,str3 = %lu",[str1 retainCount],[str2 retainCount],[str3 retainCount]);
23
24
25         //2.将3个对象添加到可变数组中
26         NSMutableArray *array = [NSMutableArray array];
27         [array addObject:str1];
28         [array addObject:str2];
29         [array addObject:str3];
30         NSLog(@"str1 = %lu,str2 = %lu,str3 = %lu",[str1 retainCount],[str2 retainCount],[str3 retainCount]);
31
32
33         //3.对3个对象做retain操作
34         [str1 retain];
35         [str2 retain];
36         [str3 retain];
37         NSLog(@"str1 = %lu,str2 = %lu,str3 = %lu",[str1 retainCount],[str2 retainCount],[str3 retainCount]);
38
39         //4.将3个对象从数组中删除
40         [array removeObject:str1];
41         [array removeObject:str2];
42         [array removeObject:str3];
43         NSLog(@"str1 = %lu,str2 = %lu,str3 = %lu",[str1 retainCount],[str2 retainCount],[str3 retainCount]);
44
45         //5.对对象做release操作---对应上面的retain操作
46         [str1 release];
47         [str2 release];
48         [str3 release];
49         NSLog(@"str1 = %lu,str2 = %lu,str3 = %lu",[str1 retainCount],[str2 retainCount],[str3 retainCount]);
50
51
52         //6.对对象做release操作---对应上面的对象创建操作(避免内存泄露)
53         [str1 release];
54         [str2 release];
55         [str3 release];
56     }
57     return 0;
58 }

    测试结果是:

2015-08-13 17:41:26.569 03-unmutableobject[1622:105614] str1 = 18446744073709551615,str2 = 18446744073709551615,str3 = 1
2015-08-13 17:41:26.570 03-unmutableobject[1622:105614] str1 = 18446744073709551615,str2 = 18446744073709551615,str3 = 2
2015-08-13 17:41:26.571 03-unmutableobject[1622:105614] str1 = 18446744073709551615,str2 = 18446744073709551615,str3 = 3
2015-08-13 17:41:26.571 03-unmutableobject[1622:105614] str1 = 18446744073709551615,str2 = 18446744073709551615,str3 = 2
2015-08-13 17:41:26.571 03-unmutableobject[1622:105614] str1 = 18446744073709551615,str2 = 18446744073709551615,str3 = 1
Program ended with exit code: 0

说明:可以明显看出,NSString是不适用引用计数机制的。

时间: 2024-08-30 01:15:03

Objective-C:MRC(引用计数器)在OC内部的可变对象是适用的,不可变对象是不适用的(例如 NSString、NSArray等)的相关文章

Objective-C:MRC(引用计数器)获得对象所有权的方式(init、retain、copy等)

.h声明文件 1 // Integer.h 2 // 02-MRC 3 // 4 // Created by ma c on 15/8/13. 5 // Copyright (c) 2015年 bjsxt. All rights reserved. 6 // 7 8 #import <Foundation/Foundation.h> 9 10 @interface Integer : NSObject 11 @property(nonatomic,assign)NSInteger i; 12

内存管理一道数组存储例题存储精讲! (oc手动管理内存,引用计数器)

//定义一个bigArr数组, NSMutableArray *bigArr = [[NSMutableArray alloc] init]; //引用计数0 - 1 //此时只是定义了一个smallArr 并没有开辟空间,所以引用计数不加一 NSMutableArray *smallArr = nil; for (int i = 0 ; i < 13 ; i++ ) { if (i % 3 == 0 ) { // 0 3 6 9 12 //此时为smallArr数组开辟了空间, smallAr

Objective-C:MRC手动释放对象内存举例(引用计数器)

手机内存下的类的设计练习: 设计Book类, 1.三个成员变量: title(书名)author(作者).price(价格) 2.不使用@property,自己完成存取方法(set方法,get方法) 3.加入必要其他的方法 4.并对Book类进行测试 .h声明文件 1 // Book.h 2 // 引用计数器 3 // 4 // Created by ma c on 15/8/13. 5 // Copyright (c) 2015年 bjsxt. All rights reserved. 6 /

内存管理(简介,引用计数器)

移动设备的内存及其有限,每个app所占的内存是有限制的 下列行为都会增加一个app的内存占用 1,创建一个OC对象 2,定义一个变量 3,调用一个函数或者方法 当app所占用的内存比较多时,系统会发出内存警告,这时得回收一些不需要再使用的空间.比如回收一些不需要使用的对象,变量等. 如果app占用内存过大: 系统可能会强制关闭app,造成闪退现象,影响用户体验. 所谓内存管理,就是对内存进行管理,涉及的操作有: 分配内存:比如创建一个对象,会增加内存占用 清楚内存:比如销毁一个对象,能减小内存占

写时拷贝 引用计数器模型

1.深浅拷贝的使用时机: 浅拷贝:对只读数据共用一份空间,且只释放一次空间: 深拷贝:数据的修改,的不同空间: 2.引用计数器模型 使用变量use_count,来记载初始化对象个数: (1).static模型(此处只用浅拷贝与浅赋值) #include<iostream> #include<string.h> #include<malloc.h> using namespace std; class String{ public:     String(const ch

黑马程序员-内存管理之引用计数器

1.引用计数器 每种语言都有自己的内存管理机制,当然OC也不例外.当一个对象创建的时候,系统在堆中给这个对象分配了一块存储区域,这个对象被栈中的对象指针所指向,当没有任何指针指向这个对象的时候,系统怎么释放这块对象内存呢?OC中是用引用计数器来实现的.每一个对象拥有一个引用计数器(占四个字节),当对象被创建时,自带的引用计数器的值就为1了.给对象发送retain消息时,对象的引用计数器就做+1操作,表示有指针拥有这个对象,发送release消息时引用计数器做-1操作,表示某个指针不在拥有这个对象

Objective-C - 自动引用计数器

引用计数器的基本操作 /* 1.方法的基本使用 1> retain :计数器+1,会返回对象本身 2> release :计数器-1,没有返回值 3> retainCount :获取当前的计数器 4> dealloc * 当一个对象要被回收的时候,就会调用 * 一定要调用[super dealloc],这句调用要放在最后面 2.概念 1> 僵尸对象 :所占用内存已经被回收的对象,僵尸对象不能再使用 2> 野指针 :指向僵尸对象(不可用内存)的指针,给野指针发送消息会报错

Objective-C:OC内部可变对象和不可变对象的深(复制)拷贝问题思考:

OC内部:可变对象和不可变对象的深(复制)拷贝问题思考: 不可变对象: 例如NSString对象,因为NSString对象是常量字符串,所以,不可以更改其内容,但是可以修改指向该字符串的指针指向.当对NSString对象做深拷贝时,如果是copy复制方式,其实就是浅复制,只是复制了同一个对象的指针:如果是mutableCopy复制方式,系统会分配一个新的内存空间用来存放复制出来的NSMutableString对象,此时地址是新的,内容是一样的,他们正在被不同的实例变量字符串指针指着. 可变对象:

【C语言】【面试题】C++中String类引用计数器的浅拷贝写法与深拷贝写法

Linux操作下String类的实现--引用计数器 1.引用计数器写法一 写法一个人比较喜欢叫他双指针法,因为他是在类里面创建了两个指针来实现的一个是指针_str,另外一个是用来保存指向同一块空间个数的指针_pRefCount. class String { public:     String(char* str = "")         :_str(new char[strlen(str) + 1])         , _pRefCount(new int(1))     {