黑马程序员--oc基础第五篇

五.oc的语法基础(内存管理上)

1.引用计数器:在每一个对象里都有一个引用计数器,占用4个字节的空间,在一个对象创建时引用计数器的值初始化为1.

*给对象发送一条retain消息,可以使引用计数器的值+1(retain方法返回对象本身)

*给对象发一条release消息,则计数器的值-1

*可以给对象发送retaincount消息来获取当前引用计数器的值

*当一个对象被销毁时,系统会自动向对象发送一条dealloc消息,就像遗言一样,可以对他进行改写,一但改写就必须调用[super dealloc]方法,且该方法必须放在最后

*不要直接调用的dealloc方法

*以后凡是见到retain就要用release,见到alloc就要用release。

以上是部分内存管理的内容遵循的原则就是“谁污染,谁治理,谁创建,谁销毁的原则”,下面我自己谢了一个非ARC形式的程序,大家认真读一下

main.m

#import <Foundation/Foundation.h>
#import "Perosn.h"
#import "Student.h"
#import "Book.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {

        Student *stu=[Student new];//stu=1
        Book *book=[Book new];//book=1
        stu.book=book;//book=2 stu=1
        book.stu=stu;//book=2 stu=1

        [book release];//book=1,stu=1
        [stu release];//book=1,stu=0;

    }
    return 0;
}

Person.h

#import <Foundation/Foundation.h>

@interface Perosn : NSObject

@property (nonatomic,assign) int age;

@end

Person.m

#import "Perosn.h"

@implementation Perosn

-(void)dealloc
{
    NSLog(@"Person 对象被释放了!!!!");
    [super dealloc];
}

@end

Student.h

#import "Perosn.h"
@class Book;
@interface Student : Perosn

@property (nonatomic,retain) Book *book;

@property (nonatomic,assign) int no;

@end

Student.m

#import "Student.h"
#import "Book.h"
@implementation Student

-(void)dealloc
{
    [_book release];//book= 0; stu=0;
    NSLog(@"Student 对象被释放了!!!!");
    [super dealloc];
}
@end

Book.h

#import <Foundation/Foundation.h>
#import "Student.h"
@interface Book : NSObject

{
    Student *_stu;
}

- (void)setStu:(Student *)stu;

- (Student *)stu;
@end

BOOK.m

#import "Book.h"

@implementation Book

-(void)setStu:(Student *)stu
{
//    if(_stu!=stu)
//    {
//        [_stu release];
//        _stu=[stu retain];
//    }
    _stu=stu;
}

-(Student *)stu
{
    return _stu;
}

-(void)dealloc
{
    NSLog(@"Book 对象被释放了!!!!");

    [super dealloc];
}
@end

每当引用了一个对象类型的数据计数器的值就会+1,每当释放一个对象,对象计数器的值-1。

2.野指针,出现野指针的根本原因在于对象是存放在堆中,而指针是存放在栈中的,所以当引用计数器的值为0的时候,对象释放了,但是这是指向这个对象的指针还在,所以 就出现了,指向一个对象的指针是不可用的。出现错误

所以一把呢解决方法是p=nil什么时候用完了就释放指针,因为oc中空指针调用方法,不产生任何效果,也不会出现任何错误,所以说不会出错

3.当使用非ARC机制是成员变量的set方法的写法:

#import "Car.h"

@implementation Car

- setCar:(Car *)car
{
    if (car!=_car) {
        [_car release];
        _car=[car retain];
    }
}

- (void)dealloc
{
    [_car release];
    [super dealloc];
}
@end

以上是就是非ARC机制下的内存管理,认真阅读你将受益匪浅。

时间: 2024-12-15 06:52:56

黑马程序员--oc基础第五篇的相关文章

黑马程序员--oc基础第八篇

八. oc基础知识(Protocal) protocal 出发点:他仅仅是用来声明方法的. 1. 可以用来声明一大堆方法(但是不能声明成员变量) 2. 只要某个类遵守了这个协议,就相当于拥有这个协议中的所有方法声明 3. 只要父类遵守了某个协议,就相当于子类也遵守了 4. 协议列出了一组方法,有些是必须实现的,有些是选择实现(@optional).遵守协议就要实现协议里面所有必须实现的方法.         1. 定义一个协议 协议格式的编写 @protocol协议名称//为协议起一个有意义的名

黑马程序员--oc基础第六篇

六. oc基础知识(内存管理下) 总结:内存管理代码规范 1.只要调用alloc那么就必须调用release: 2.set方法的代码部分 *基本数据类型直接赋值. *如果是oc对象类型 - (void) setCar:(Car *)car { if(_car!=car) { [_car release]; _car=[Car retain]; } } 3.dealloc 部分的代码规范 *一定要[super dealloc ]放在最后面. *对self(当前)所拥有的其他对象做一次release

黑马程序员--oc基础第十篇(foundation框架下、集合)

十 . oc基础(Foundation框架下) 1.下面介绍几种OC对象类型的存储结构:NSArray,NSDictionary,NSSet,以及基本数据类型封装类. NSNumber:*既然这几种数据结构都是用来存放对象类型的那么基本数据类型想要放入其中就要先对他们进行封装.使用NSNumber对基本数据类型进行封装. // // Created by keeganlee on 15/3/2. // Copyright (c) 2015年 keeganlee. All rights reser

黑马程序员--oc基础第四篇

df 四:oc的基础语法

黑马程序员--oc基础第九篇(Foundation框架上)

九 . oc基础(Foundation框架上) 1.四中结构体类型:NSRange,NSPoint,NSSize,NSRect 1>NSRange:是一个以为的结构由成员location和成员length共同组成. *NSRange的创建方式:NSRange range=NSMakeRange(2.4),代表范围是从2开始一直到5,location为2,length为4 *NSString *[email protected]“I love you”:NSRange range=[str ran

黑马程序员---OC基础8【block类型】【Protocol】

------- iOS培训.Android培训.Java培训.期待与您交流! ---------- [block类型] 1.block概念 block对象是一个C级别的语法和运行机制,不同之处,它除了有可执行代码以外,它还包含了与堆栈内存绑定的变量 方法的回调 block是一个类型,定义变量,用来存储代码块 2.block基本用法 block与函数很相似,有返回值类型,参数类型,主体: 返回值类型 (^block变量名)(形参列表) = ^(形参列表) { }; 没有参数可以写void,比如:i

黑马程序员---OC基础9【Foundation框架】【NSString介绍】【NSURL读写字符串】【NSString字符串比较】【NSString前后缀检查及搜索】【NSRange使用】

------- iOS培训.Android培训.Java培训.期待与您交流! ---------- [Foundation框架] 1.Foundation框架介绍 1)Foundation框架概念 框架是由许多类.方法.函数.文档按照一定的逻辑组织起来的集合 以便使研发程序变得 更容易在OS X下的Mac操作系统中大约有80个框架为所有程序开发奠定基础的框架称为Foundation 框架 2)Foundation框架的作用 Foundation框架是Mac\iOS中其他框架的基础 Foundat

黑马程序员--oc基础第一篇

一.oc的基础知识 1.oc的源代码的扩展名为:“.m” 2.不再用include了,改用#import<Foundation/foundation.h>,区别就是import自动检查是否包含了相同的头文件,不需要再在c语言中用IFDef了. 3.类的声明用@interface @end,将声明代码写在两部分之间. 4.BOOL 类型的实质为char typedef signed char BOOL: #define Yes (BOOL) 1 #define No (Bool) 0 5.在oc

黑马程序员---OC基础7【ARC概念】【ARC对象内存管理】【分类Category】

------- iOS培训.Android培训.Java培训.期待与您交流! ---------- [ARC概念]   1.指针的分类 1)强指针,默认的情况下,所有的指针都是强指针,关键字strong: 2)弱指针,_ _weak关键字修饰符的指针 2.ARC概念 自动引用计数 永远不要写retain和release.autorelease三个关键字 编译器会在编译的时候自动插入retain和release.autorelease, 是一个编译器的特性:“垃圾回收”是运行时的特性 3.ARC工