内存管理 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)的更多相关文章

  1. Objective-C 内存管理retain和release

    OC使用引用计数来管理内存,每个继承NSObject的对象,内部都维护了一个引用计数器retainCount.当对象创建时(调用alloc或者new)引用计数器会+1, 手动调用retain()方法能 ...

  2. OC 内存管理之手动内存管理MRC

    一.基本原理 1.什么是内存管理 内存管理的重要性: 移动设备的内存极其有限,每个app所能占用的内存是有限制的 当app所占用的内存较多时,系统会发出内存警告,这时得回收一些不需要再使用的内存空间. ...

  3. OC 内存管理机制总结

    OC 内存管理机制总结 一:OC内存管理机制目前分为两块,其一自动内存管理机制,其二手动内存管理机制: 1.首先我们从自动内存管理机制讲起: 1)什么是自动内存管理机制,自动内存管理机制就是程序中所创 ...

  4. OC内存管理基础

    OC 内存管理基础 一. retain和release基本使用 使用注意: 1.你想使用(占用)某个对象,就应该让对象的计数器+1(让对象做一次retain操作) 2.你不想再使用(占用)某个对象,就 ...

  5. QF——OC内存管理详解

    堆的内存管理: 我们所说的内存管理,其实就是堆的内存管理.因为栈的内存会自动回收,堆的内存需要我们手动回收. 栈中一般存储的是基本数据类型变量和指向对象的指针(对象的引用),而真实的对象存储在堆中.因 ...

  6. OC内存管理-OC笔记

    内存管理细节:http://blog.sina.com.cn/s/blog_814ecfa90102vus2.html 学习目标 1.[理解]内存管理 2.[掌握]第一个MRC程序 3.[掌握]内存管 ...

  7. OC内存管理-黄金法则

    1.内存管理-黄金法则 The basic rule to apply is everything that increases the reference counter with alloc, [ ...

  8. OC内存管理总结,清晰明了!

    <span style="font-size:18px;">OC内存管理 一.基本原理 (一)为什么要进行内存管理. 由于移动设备的内存极其有限.所以每一个APP所占的 ...

  9. 31 (OC)* 内存管理

    31 (OC)  内存管理 一:内存管理黄金法则. 如果对一个对象使用了alloc.[Mutable]copy,retain,那么你必须使用相应的realease或者autorelease 二:内存管 ...

随机推荐

  1. linux下安装软件的方法(mariadb)

    一.方式 1. rpm (不推荐使用) 2. yum 安装(非常方便快捷) 3. 编译安装(需要自定制的时候才使用) 二.技术栈 #闭源收费的技术栈: svn + java + apache(web服 ...

  2. like模糊查询%注入问题

    android like 全局模糊查找文件命名 通过条件通过 like %search% 如果查找的关键字是% 那么就成了 like %%% 就会查找出所有的文件 解决办法是先把正则里面的匹配符 替换 ...

  3. Oracle RAC集群搭建(二)-基础环境配置

    01,创建用户,用户组 [root@rac1 ~]# groupadd -g 501 oinstall [root@rac1 ~]# groupadd -g 502 dba [root@rac1 ~] ...

  4. oracle 基础知识(四) 构成

    一, oracle服务 一个oracle 服务由一个oracle 实例和一个oracle数据库组成. oracle = instance + database 总体概念: 二, oracle 实例 0 ...

  5. Flask中的的SQLAlchemy

    好久没有更新Blog了 今天来聊一聊 Python 的 ORM 框架 SQLAlchemy 有的孩子已经听说过这个框架的大名了,也听说了 SQLAlchemy 没有 Django 的 Models 好 ...

  6. SpringMvc上传文件遇到重复读取InputStream的问题

    文件上传配置: <bean id="multipartResolver" class="org.springframework.web.multipart.comm ...

  7. Mysql系列-字符集

    字符集 怎样选择合适的字符集 如果应用程序需要发布到很多国家和地区,需要支持各种各样的文字,则选择Unicode编码,Mysql中即UTF-8.q如果需要将数据导入数据库,这时候要注意数据库字符集对数 ...

  8. MySQL关联left join 条件on与where不同

    以下的文章主要讲述的是MySQL关联left join 条件on与where 条件的不同之处,我们现在有两个表,即商品表(products)与sales_detail(销售记录表).我们主要是通过这两 ...

  9. Jersey统一异常处理

    众所周知,java服务提供者提供给服务请求者应该是特定格式的数据,而不能出现异常栈类似信息,那么jersey中,如何添加统一的异常处理呢? 针对jersey启动如果是实现了ResourceConfig ...

  10. FZU 1884——排火车——————【栈的模拟】

    排火车 Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u Submit Status P ...