今天看了看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. linux_无密登录

    使用下例中ssky-keygen和ssh-copy-id,仅需通过3个步骤的简单设置而无需输入密码就能登录远程Linux主机. ssh-keygen 创建公钥和密钥. ssh-copy-id 把本地主 ...

  2. B二分法

    <span style="color:#330099;">/* B - 二分法 基金会 Time Limit:1000MS Memory Limit:65536KB 6 ...

  3. 内存排查 valgrind

    内存问题排查工具 --- valgrind 1. 概述 2. Valgrind 3. 内存泄漏监测 3.1. 示例代码 3.2. 编译它 3.3. 用Valgrind监测进程的内存泄漏 4. 悬挂指针 ...

  4. OCP-1Z0-051-名称解析-文章32称号

    32. Which CREATE TABLE statement is valid? A. CREATE TABLE ord_details          (ord_no NUMBER(2) PR ...

  5. 在Windows系统中安装集成的PHP开发环境

    原文:在Windows系统中安装集成的PHP开发环境 刚想学php的,又不会配置复杂php的环境,可以使用集成的,目前网上提供常用的PHP集成环境主要有AppServ.phpStudy.WAMP和XA ...

  6. Java设计模式(八)观察者模式 迭代器模式

    (十五)观察者模式 观察者模式,定义对象间一对多关系,一个对象状态发生改变,全部依赖于它的对象都收到通知而且自己主动更新,观察者与被观察者分开.比如邮件订阅.RSS订阅,假设有更新就会邮件通知你. i ...

  7. archlinux的wiki非常强壮

    最近发现搜索linux工具或系统配置内容.来自同一个站点很多很好的资源:https://www.archlinux.org/,网站wiki(https://wiki.archlinux.org/)中有 ...

  8. 什么是EF, 和 Entity Framework Demo简单构建一个良好的发展环境

     Entity Framwork(实体框架.缩写EF)这是ORM(Object Relational Mapping.对象映射关系)一个解决方案. EF的表映射为实体.并封装了操作方法.方便开发者 ...

  9. Error with mysqld_safe

    出处:http://bugs.mysql.com/bug.php?id=18403 Description: - I downloaded the binary file “Standard 5.0. ...

  10. 用批处理编译*.sln工程

    原文:用批处理编译*.sln工程 批处理是直接调用Microsoft Visual Studio 8\Common7\IDE\ 目录内的 devenv.exe ,它启动后就是IDE,提供的参数如下: ...