Object-c学习之路二(oc内存管理黄金法则1)
今天看了看oc的内存管理,自己管理内存不能随便的release和retain 法则会出现野指针等错误。下面以人和读书的例子做练习。
1.主函数
//
// main.m
// MemoryManagement
//
// Created by WildCat on 13-7-23.
// Copyright (c) 2013年 wildcat. All rights reserved.
// #import <Foundation/Foundation.h>
#import "Student.h"
#import "Book.h"
void test1(){ Student *stu=[[Student alloc] init]; [stu retain]; NSLog(@"stu 的计算器为:%zi",[stu retainCount]);//2
[stu release];//1
[stu release];//0 }
#pragma mark 添加书
void addBook(Student *stu){
Book *book=[[Book alloc] initWithPrice:3.5];
stu.book=book;
[book release]; Book *book2=[[Book alloc] initWithPrice:4.5];
stu.book=book2;
[book2 release]; }
#pragma mark 读书
void readBooks(Student *stu){
[stu readBook]; }
#pragma mark 主函数
int main(int argc, const char * argv[])
{ @autoreleasepool { Student *stu=[[Student alloc] initWithAge:22];
Student *stu1=[[Student alloc] initWithAge:20]; addBook(stu1);
readBooks(stu1); addBook(stu);
readBooks(stu);
[stu release];//多写[stu release]会出现野指针错误,[nil release]则不会
[stu1 release]; }
return 0;
}
2.Student函数
// Student.h
// MemoryManagement
//
// Created by WildCat on 13-7-23.
// Copyright (c) 2013年 wildcat. All rights reserved.
// #import <Foundation/Foundation.h>
#import "Book.h"
@interface Student : NSObject{
int _age;
Book *_book; }
@property int age;
@property Book *book; -(id)initWithAge:(int)age;
-(void) readBook;
@end
//
// Student.m
// MemoryManagement
//
// Created by WildCat on 13-7-23.
// Copyright (c) 2013年 wildcat. All rights reserved.
// #import "Student.h" @implementation Student
@synthesize age=_age;
-(Book *)getBook{
return _book; }
-(void)setBook:(Book *)book{
if (_book!=book){
//先释放旧的
[_book release];
//再retain 新的
_book=[book retain];
} } //重写dealloc方法,当对象的计数器是1时自动调用该方法
#pragma mark - 静态方法
#pragma mark 回收对象
- (void)dealloc
{
[_book release];
NSLog(@"Student %i,内存被释放。",_age);
[super dealloc];
} #pragma mark - 公共方法
#pragma mark 读书
-(void)readBook{ NSLog(@"当前读的书为:%f",_book.price); }
#pragma mark 构造函数
-(id)initWithAge:(int)age{
if(self=[super init]){
_age=age;
} return self;
} @end
3.Book函数
// Book.h
// MemoryManagement
//
// Created by WildCat on 13-7-23.
// Copyright (c) 2013年 wildcat. All rights reserved.
// #import <Foundation/Foundation.h> @interface Book : NSObject{
float _price;
}
@property float price; -(id) initWithPrice:(float)price; @end
// Book.m
// MemoryManagement
//
// Created by WildCat on 13-7-23.
// Copyright (c) 2013年 wildcat. All rights reserved.
// #import "Book.h" @implementation Book
@synthesize price=_price; #pragma mark 注销函数
-(void)dealloc{ NSLog(@"Book %f ,被销毁。",_price);
[super dealloc];
}
#pragma mark 构造函数
-(id) initWithPrice:(float)price{
if (self=[super init]){
_price=price;
}
return self;
}
@end
Object-c学习之路二(oc内存管理黄金法则1)的更多相关文章
- OC内存管理-黄金法则
1.内存管理-黄金法则 The basic rule to apply is everything that increases the reference counter with alloc, [ ...
- OC内存管理-OC笔记
内存管理细节:http://blog.sina.com.cn/s/blog_814ecfa90102vus2.html 学习目标 1.[理解]内存管理 2.[掌握]第一个MRC程序 3.[掌握]内存管 ...
- OC 内存管理机制总结
OC 内存管理机制总结 一:OC内存管理机制目前分为两块,其一自动内存管理机制,其二手动内存管理机制: 1.首先我们从自动内存管理机制讲起: 1)什么是自动内存管理机制,自动内存管理机制就是程序中所创 ...
- OC内存管理基础
OC 内存管理基础 一. retain和release基本使用 使用注意: 1.你想使用(占用)某个对象,就应该让对象的计数器+1(让对象做一次retain操作) 2.你不想再使用(占用)某个对象,就 ...
- 【Spark-core学习之八】 SparkShuffle & Spark内存管理
[Spark-core学习之八] SparkShuffle & Spark内存管理环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 ...
- OC内存管理总结,清晰明了!
<span style="font-size:18px;">OC内存管理 一.基本原理 (一)为什么要进行内存管理. 由于移动设备的内存极其有限.所以每一个APP所占的 ...
- 31 (OC)* 内存管理
31 (OC) 内存管理 一:内存管理黄金法则. 如果对一个对象使用了alloc.[Mutable]copy,retain,那么你必须使用相应的realease或者autorelease 二:内存管 ...
- QF——OC内存管理详解
堆的内存管理: 我们所说的内存管理,其实就是堆的内存管理.因为栈的内存会自动回收,堆的内存需要我们手动回收. 栈中一般存储的是基本数据类型变量和指向对象的指针(对象的引用),而真实的对象存储在堆中.因 ...
- Redis——学习之路二(初识redis服务器命令)
上一章我们已经知道了如果启动redis服务器,现在我们来学习一下,以及如何用客户端连接服务器.接下来我们来学习一下查看操作服务器的命令. 服务器命令: 1.info——当前redis服务器信息 s ...
随机推荐
- 经验28--相关时间戳,C#
时间戳通常用于设置独特性质,保存图片之类的,到文件名后添加. 时间戳一般17地点. 1.获取的当前时间的时间戳. DateTime dtStart = TimeZone.CurrentTimeZone ...
- crawler_Docker_解决用 JavaScript 框架开发的 Web 站点抓取
[转载,后续补上实践case] 有了 Docker,用 JavaScript 框架开发的 Web 站点也能很好地支持网络爬虫的内容抓取 [编者的话]Prerender 服务能够为网络爬虫提供预先渲染的 ...
- django中通过model名字获取model
django1.6, 通过字符串和get_app.get_model获得对应的object 只需要两行代码: from django.db.models import get_model get_mo ...
- 6最好的之一 HTML5/CSS3 演示(PPT)框架
HTML 是全世界最流行的网页编程语言.而HTML5是这门语言的升级版本号.越来越多的开发人员和设计师開始使用HTML5.以下介绍几个 HTML5/CSS3 的演示工具和框架,你能够用它们来创建你的网 ...
- 位记录——Windows 7已安装Sublime Text 3、cynwin、SublimeClang
转载请注明出处:http://blog.csdn.net/cywosp/article/details/34429697 1. 到https://www.cygwin.com/下载setup-x86_ ...
- [转载]CSS元素的定位position
CSS元素的定位position 属性position 值 描述 absolute 生成绝对定位的元素,相对于 static 定位以外的第一 ...
- 【百度地图API1.1】修改文本标注的样式
原文:[百度地图API1.1]修改文本标注的样式 百度地图API1.0中文本标注的样式写法为: label.getDom().style.borderColor = "#808080&quo ...
- [CLR via C#]5.2 引用类型和值类型
原文:[CLR via C#]5.2 引用类型和值类型 CLR支持两种类型:引用类型和值类型. 虽然FCL中大多数都是引用类型,但开发人员用的最多的还是值类型.引用类型总是在托管堆上分配的,C#的ne ...
- SSAS系列——【03】多维数据(多维数据集对象)
原文:SSAS系列--[03]多维数据(多维数据集对象) 1.什么是Cube? 简单 Cube 对象由基本信息.维度和度量值组组成. 基本信息包括多维数据集的名称.多维数据集的默认度量值.数据源和存储 ...
- java 集装箱 arraylist 用法
1. ArrayList概述: ArrayList 是一个数组队列.相当于 动态数组. 与Java中的数组相比.它的容量能动态增长.它继承于AbstractList.实现了List, RandomAc ...