OC学习 第七节 手动内存管理
来源:互联网 发布:阅面科技 知乎 编辑:程序博客网 时间:2024/05/23 01:56
回顾
malloc free
JAVA C# GC Garbage collection 垃圾回收机制
mac os
ARC Automatic Reference Count 自动引用计数
MRC Manual Reference Count 手动管理内存
引用计数
引用:强引用/弱引用
弱引用:assign
引用计数
# 手动内存管理(Manual Reference Counting)(应用非常灵活)MRC
ARC (Automatic Reference Counting)
堆空间 :
1.忘记释放 —> 内存泄露
2.提前/过早释放 ---> 内存崩溃
3.多释放 —> 崩溃 C野指针
malloc free free
内存管理 管理的是堆空间
谁来释放?程序员负责释放
# 内存管理原理
# c模拟
# retain release dealloc
# new
# setter方法中的内存注意事项
# 不要管太多,管好自己 黄金法则
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
NSMutableString *str1 = nil;
NSMutableString *str2 = nil;
@autoreleasepool {
str1 = [[NSMutableString alloc] initWithString:@"Welcome to beijing"];
str2 = [NSMutableString stringWithString:@"Welcome to zhenzhou"];
NSLog(@"%@ %ld", str1, str1.retainCount);
NSLog(@"%@ %ld", str2, str2.retainCount);
}
NSLog(@"-------------------------");
[str1 setString:@"Respect China"];
[str1 release];
[str1 release];
NSLog(@"%@ %ld", str1, str1.retainCount);
//[str2 release];
//NSLog(@"%@ %ld", str2, str2.retainCount);
return 0;
}
/*
综上,上面的内存管理比较混乱,有些对象创建之后 用完了可以release释放,有些创建对象之后 就不能再次release
如何解决上面的混乱??
要遵守OC内存管理原则/法则 ----》黄金法则
//alloc/new copy /mutableCopy 会使对象计数器置为1
//retain 使对象的计数器+1
当我们程序员自己用alloc/new/copy/mutableCopy/retain开头的函数把对象地址赋给一个新的指针变量(拥有了对象的绝对使用权),指针用完对象之后,不再使用对象的时候,那么指针应该立即release或者autorelease(放弃绝对使用权)。每个指针只需要管理好自己就可以了,不需要管理其他的指针(各人顾个人原则),释放之后的指针就不要再操作原来的对象了
结论
1.只有程序员自己写出来alloc/new/copy/mutableCopy/retain这些函数,用完指针之后要对应出现一个release/autorelease
如果没有上面的函数 就不需要管
2.什么时候retain??? 当一个对象多出一个指针指向的时候
以后我们在写代码的时候 都要遵守黄金法则
*/
# 字符串的copy/mutableCopy
注:
Dog *dog2 = [dog1 copy];
在使用copy /mutableCopy的时候 ,使用的对象所属的类必须要遵守协议NSCopying /NSMutableCopying协议,实现里面的方法。
因为在执行copy函数的时候,内部会调用当前对象的copyWithZone:方法, 所以使用copy前 必须要遵守协议实现copyWithZone:方法
NSString NSArray NSDictionary 这些类都遵守了拷贝协议 实现了里面的方法,可以直接用copy 。可以字符串对象常常用拷贝函数
# dealloc
# 内存管理之属性要注意的地方
# autorelease和自动释放池
# 数组/字典的内存管理
malloc free
JAVA C# GC Garbage collection 垃圾回收机制
mac os
ARC Automatic Reference Count 自动引用计数
MRC Manual Reference Count 手动管理内存
引用计数
引用:强引用/弱引用
弱引用:assign
引用计数
# 手动内存管理(Manual Reference Counting)(应用非常灵活)MRC
ARC (Automatic Reference Counting)
堆空间 :
1.忘记释放 —> 内存泄露
2.提前/过早释放 ---> 内存崩溃
3.多释放 —> 崩溃 C野指针
malloc free free
内存管理 管理的是堆空间
谁来释放?程序员负责释放
# 内存管理原理
# c模拟
# retain release dealloc
# new
# setter方法中的内存注意事项
# 不要管太多,管好自己 黄金法则
#import <Foundation/Foundation.h>
int main(int argc, const char * argv[]) {
NSMutableString *str1 = nil;
NSMutableString *str2 = nil;
@autoreleasepool {
str1 = [[NSMutableString alloc] initWithString:@"Welcome to beijing"];
str2 = [NSMutableString stringWithString:@"Welcome to zhenzhou"];
NSLog(@"%@ %ld", str1, str1.retainCount);
NSLog(@"%@ %ld", str2, str2.retainCount);
}
NSLog(@"-------------------------");
[str1 setString:@"Respect China"];
[str1 release];
[str1 release];
NSLog(@"%@ %ld", str1, str1.retainCount);
//[str2 release];
//NSLog(@"%@ %ld", str2, str2.retainCount);
return 0;
}
/*
综上,上面的内存管理比较混乱,有些对象创建之后 用完了可以release释放,有些创建对象之后 就不能再次release
如何解决上面的混乱??
要遵守OC内存管理原则/法则 ----》黄金法则
//alloc/new copy /mutableCopy 会使对象计数器置为1
//retain 使对象的计数器+1
当我们程序员自己用alloc/new/copy/mutableCopy/retain开头的函数把对象地址赋给一个新的指针变量(拥有了对象的绝对使用权),指针用完对象之后,不再使用对象的时候,那么指针应该立即release或者autorelease(放弃绝对使用权)。每个指针只需要管理好自己就可以了,不需要管理其他的指针(各人顾个人原则),释放之后的指针就不要再操作原来的对象了
结论
1.只有程序员自己写出来alloc/new/copy/mutableCopy/retain这些函数,用完指针之后要对应出现一个release/autorelease
如果没有上面的函数 就不需要管
2.什么时候retain??? 当一个对象多出一个指针指向的时候
以后我们在写代码的时候 都要遵守黄金法则
*/
# 字符串的copy/mutableCopy
注:
Dog *dog2 = [dog1 copy];
在使用copy /mutableCopy的时候 ,使用的对象所属的类必须要遵守协议NSCopying /NSMutableCopying协议,实现里面的方法。
因为在执行copy函数的时候,内部会调用当前对象的copyWithZone:方法, 所以使用copy前 必须要遵守协议实现copyWithZone:方法
NSString NSArray NSDictionary 这些类都遵守了拷贝协议 实现了里面的方法,可以直接用copy 。可以字符串对象常常用拷贝函数
# dealloc
# 内存管理之属性要注意的地方
# autorelease和自动释放池
# 数组/字典的内存管理
0 0
- OC学习 第七节 手动内存管理
- OC-手动内存管理
- OC基础语法学习5:内存管理(手动管理)
- OC中手动管理内存
- OC手动内存管理注意事项
- OC的手动内存管理
- 黑马程序员——OC语言学习——OC手动内存管理
- OC手动内存管理的规则总结
- iOS开发-Day20-OC 手动内存管理
- OC通讯录(MRC手动管理内存)
- oc增强之手动内存管理
- [OC基础]手动内存管理
- OC学习--内存管理
- OC学习----内存管理
- OC语法<2.1>内存管理:手动内存管理1
- OC语法<2.2>内存管理:手动内存管理2
- OC-024.OC中多对象的手动内存管理
- OC-025.OC手动MRC内存管理@property的使用方法
- Ubuntu 添加应用程序到Launcher
- Linux USB驱动分析之USB2.0协议分析
- Request&Response编程
- Duilib界面布局文件XML学习-XML文件简介
- 两个框架之间的数据类型转换,需要桥接技术
- OC学习 第七节 手动内存管理
- Java :Annotation(注释)
- Django - “no module named django.core.management”
- 两种方式的i2c设备驱动的编写方法
- 臭石头的使用(Cornerstone),冲突的解决
- 进制转换函数
- 常用的电压基准芯片
- K中心点算法(K-medoids)
- Eclipse快捷键