OC 内存管理(retain和release)
内存管理 retain和release简单使用
#import "Student.h" @implementation Student
@synthesize age = _age; // 在xcode4.5环境下可以省略 - (void)dealloc {
NSLog(@"%@被销毁了", self); [super dealloc];
// 一定要调用super的dealloc方法,而且最好放在最后面调用
}
@end
#import <Foundation/Foundation.h>
#import "Student.h" void test() {
Student *stu = [[Student alloc] init]; // 1 // z代表无符号
NSLog(@"count:%zi", [stu retainCount]); [stu retain]; // NSLog(@"count:%zi", [stu retainCount]); [stu release]; // NSLog(@"count:%zi", [stu retainCount]); [stu release]; // 0 // [stu release]; // 会发生野指针错误,也就是说访问了不属于你的内存
} void test1() {
// Student对象的计数器永远为1,所以不可能被释放
[[Student alloc] init].age = ; [Student new].age = ; // 上面的代码都有内存泄露
} int main(int argc, const char * argv[])
{
@autoreleasepool { }
return ;
}
对象之间的内存管理
#import "Student.h" @implementation Student #pragma mark - 生命周期方法
#pragma mark 构造方法
- (id)initWithAge:(int)age {
if ( self = [super init] ) {
_age = age;
} return self;
} #pragma mark 回收对象
- (void)dealloc {
// 释放Book对象
[_book release]; // [self.book release]; NSLog(@"student:%i 被销毁了", _age);
[super dealloc];
} #pragma mark - getter和setter
// @synthesize book = _book;
// 如果自己手动实现了getter和setter,xcode就不会自动生成@synthesize
// 也就不会自动生成_book
// getter和setter的默认实现
- (void)setBook:(Book *)book {
if (_book != book) {
// 先释放旧的成员变量
[_book release];
// 再retain新传进来的对象
_book = [book retain];
}
} - (Book *)book {
return _book;
} #pragma mark - 公共方法
#pragma mark 读书
- (void)readBook {
NSLog(@"当前读的书是:%f", _book.price);
} //#pragma mark - 私有方法
//#pragma mark 私有方法1
//- (void)test1 {
//
//
//}
//#pragma mark 私有方法2
//- (void)test2 {
//
//
//}
//#pragma mark 私有方法3
//- (void)test3 {
//
//
//} @end
@property的参数
#import <Foundation/Foundation.h> @class Book;
@class Card; @interface Student : NSObject // 这里的retain代表:在set方法中,release旧值,retain新值
@property (nonatomic, retain) Book *book; @property (retain) Card *card; // readonly代表只生成get方法的声明
// 默认是readwrite,同时生成get和set方法的声明
@property (readonly) int age; // atomic就代表给方法进行加锁,保证线程安全
@property (atomic) int no; // nonatomic代表方法不需要考虑线程安全问题
@property (nonatomic, assign) int no2; // getter是用来指定get方法的方法名
@property (nonatomic, getter = isRich) BOOL rich;
@end
autorelease
#import <Foundation/Foundation.h>
#import "Student.h" int main(int argc, const char * argv[])
{
// @autoreleasepool代表创建一个自动释放池
@autoreleasepool {
Student *stu = [[[Student alloc] init] autorelease]; //[stu autorelease]; Student *stu1 = [[[Student alloc] init] autorelease];
//[stu1 autorelease]; // 这个stu2是自动释放的,不需要释放
Student *stu2 = [Student student]; // 这个str是自动释放的,不需要释放
NSString *str = [NSString stringWithFormat:@"age is %i", ]; for (int i = ; i<; i++) {
[Student student];
}
}
return ;
}
OC 内存管理(retain和release)的更多相关文章
- Objective-C 内存管理retain和release
OC使用引用计数来管理内存,每个继承NSObject的对象,内部都维护了一个引用计数器retainCount.当对象创建时(调用alloc或者new)引用计数器会+1, 手动调用retain()方法能 ...
- OC 内存管理之手动内存管理MRC
一.基本原理 1.什么是内存管理 内存管理的重要性: 移动设备的内存极其有限,每个app所能占用的内存是有限制的 当app所占用的内存较多时,系统会发出内存警告,这时得回收一些不需要再使用的内存空间. ...
- OC 内存管理机制总结
OC 内存管理机制总结 一:OC内存管理机制目前分为两块,其一自动内存管理机制,其二手动内存管理机制: 1.首先我们从自动内存管理机制讲起: 1)什么是自动内存管理机制,自动内存管理机制就是程序中所创 ...
- OC内存管理基础
OC 内存管理基础 一. retain和release基本使用 使用注意: 1.你想使用(占用)某个对象,就应该让对象的计数器+1(让对象做一次retain操作) 2.你不想再使用(占用)某个对象,就 ...
- QF——OC内存管理详解
堆的内存管理: 我们所说的内存管理,其实就是堆的内存管理.因为栈的内存会自动回收,堆的内存需要我们手动回收. 栈中一般存储的是基本数据类型变量和指向对象的指针(对象的引用),而真实的对象存储在堆中.因 ...
- OC内存管理-OC笔记
内存管理细节:http://blog.sina.com.cn/s/blog_814ecfa90102vus2.html 学习目标 1.[理解]内存管理 2.[掌握]第一个MRC程序 3.[掌握]内存管 ...
- OC内存管理-黄金法则
1.内存管理-黄金法则 The basic rule to apply is everything that increases the reference counter with alloc, [ ...
- OC内存管理总结,清晰明了!
<span style="font-size:18px;">OC内存管理 一.基本原理 (一)为什么要进行内存管理. 由于移动设备的内存极其有限.所以每一个APP所占的 ...
- 31 (OC)* 内存管理
31 (OC) 内存管理 一:内存管理黄金法则. 如果对一个对象使用了alloc.[Mutable]copy,retain,那么你必须使用相应的realease或者autorelease 二:内存管 ...
随机推荐
- hdu-1022-栈
Train Problem I Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)T ...
- PIE SDK最小噪声变换
1.算法功能简介 最小噪声分离变换是用于判定图像数据内在的维数(即波段数),分离数据中的噪声,减少随后处理中的计算需求量. MNF 本质上是两次层叠的主成分变换.第一次变换(基于估计的噪声协方差矩阵) ...
- superobject 设定排序方式
(* * Super Object Toolkit * * Usage allowed under the restrictions of the Lesser GNU General Public ...
- 转帖 JS的基础语法
1.变量 1)变量是用来存储信息的容器. 2)在javascript中使用var 运算符(variable 的缩写)加变量名定义的. varx = 10; vary = 10.1; varz = “H ...
- JavaScript资源分享
一. 资源教程: 综合类 前端知识体系 前端知识结构 Web前端开发大系概览 Web前端开发大系概览-中文版 Web Front-end Stack v2.2 En类资源汇总 免费的编程中文书籍索引 ...
- Javascript模块化编程(二)AMD规范(规范使用模块)
这个系列的第一部分介绍了Javascript模块的基本写法,今天介绍如何规范地使用模块,先想一想,为什么模块很重要?接下来为您详细介绍,感兴趣的朋友可以了解下啊.今天介绍如何规范地使用模块. 七.模块 ...
- 深入理解JavaScript系列(33):设计模式之策略模式
介绍 策略模式定义了算法家族,分别封装起来,让他们之间可以互相替换,此模式让算法的变化不会影响到使用算法的客户. 正文 在理解策略模式之前,我们先来一个例子,一般情况下,如果我们要做数据合法性验证,很 ...
- TCP/IP、Http、Soap三个基本的通讯协议
看到一个说法,比较通俗易懂: HTTP就是邮局的协议,他们规定了你的信封要怎么写,要贴多少邮票等.... SOAP就是你们之间交流的协议,负责把你所需要表达的意思写在信纸上,同时也负责 ...
- 2017年9月17日 JavaScript简介
javascript简介 javascript是个什么东西? JavaScript是个脚本语言,需要有宿主文件,它的宿主文件就是html文件. 它与java有什么关系? 没有什么直接联系,java是s ...
- 2015-08-19(i++与++i的思考)
今天看到一个很有趣的东西,关于表达式优先级的问题.如下. ; int j=(i++)+(i++); j的值是多少? 分析:编译器是从左往右编译也就是说编译器先做(i++) 1.(i++)由于是++所以 ...