今天看了看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)的更多相关文章

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

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

  2. OC内存管理-OC笔记

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

  3. OC 内存管理机制总结

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

  4. OC内存管理基础

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

  5. 【Spark-core学习之八】 SparkShuffle & Spark内存管理

    [Spark-core学习之八] SparkShuffle & Spark内存管理环境 虚拟机:VMware 10 Linux版本:CentOS-6.5-x86_64 客户端:Xshell4 ...

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

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

  7. 31 (OC)* 内存管理

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

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

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

  9. Redis——学习之路二(初识redis服务器命令)

    上一章我们已经知道了如果启动redis服务器,现在我们来学习一下,以及如何用客户端连接服务器.接下来我们来学习一下查看操作服务器的命令. 服务器命令: 1.info——当前redis服务器信息   s ...

随机推荐

  1. oracle_有关表分区_查询

    <!--查询ORACLE分区表存在多少个分区-->  SELECT * FROM USER_TAB_PARTITIONS WHERE TABLE_NAME='TBL_PAGE';  < ...

  2. app后端设计(0)--总文件夹

    原文:http://blog.csdn.net/newjueqi/article/details/19003775 做了接近两年app相关的系统架构,api设计,先后在两个创业公司中工作,经历过手机网 ...

  3. EasyUI基础知识Draggable(拖累)

    学习前easyui基于解析器,装载机.对他们来说,入门阶段,我们只需要在一个简单的理解.第一阶段,不宜过深后,.接着,根据easyui订购的文件正在研究安排官方网站Draggable插入. Dragg ...

  4. server正式的环境性能测试nginx-php 指着寻求突破的表现

    因为我是第三级城市语言.无法接触到更牛接触逼公司或环境.这是你母亲的现场环境摸过几次.截至完毕,测试已设法提高空间. 公司须要的站点执行环境.不能由于我这边的瓶颈而阻碍了公司进行,希望各位大能能不吝惜 ...

  5. css mainDiv和popbox居中

    <style>     .beCenter {         width:460px;         height:212px;         background:#ccc;    ...

  6. 注意,WebDeploy服务会占用80端口。(Windows关闭了IIS,80端口任然被占用)

    最近遇到一个很奇怪的事情,Windows上的 IIS 网站 全关掉了,80端口仍然被占用.然后我新装了一台服务器,一个一个组件地装,装一个测一次,最后发现,WebDeploy这个组件,会占用80端口. ...

  7. VBS学习日记(一个) 开始了解

    Vbs 一个 Windows 脚本,其代表 :Microsoft Visual Basic Script Editon.( 微软可视化BASIC 脚本版),VBS 是 Visual Basic 的的一 ...

  8. 为JS字符类型添加trim方法

    JS字符串本身并不没有提供常用的trim方法,我们可以通过修改String原形来添加此方法,我们就可以直接调用此方法了: String.prototype.trim = function(){retu ...

  9. 折腾源WRT的AC路无线路由-2

    在创纪录的开箱图,开箱后,我觉得大尺寸,因此,获得一些各种尺寸,喜欢网上购物的参考.也许这,安装后,它占用的大小:基本长度=28.5cm.深度=19.5cm,高=19.5,因为制造商推荐的约两个天线是 ...

  10. js面向对象学习总结

    1.函数作为参数进行传递 function a(str,fun){ console.log(fun(str)) }; function up(str){ return str.toUpperCase( ...