第四天:内存管理-property参数

1.通常引用一个类有两种方法:

1,通过#import
方法引入

2.通过@class
引入

#import 
@class
的区别:

#import "B.h"
@interface A:NSObject {
	B *b;
}
@end

1.#import
方式会包含被引用类的所有信息,包括被引用类的变量和方法。@class
方式只是告诉编译器在a.h文件中B *b只是类的声明,具体这个类里有什么信息,这是不需要知道,等实现文件中真正用到的是否,才会去查看B类中信息。

2.使用@class方式由于只需要知道被引用类(B类)的名称就可以了,而在现实类由于要用到被引用类中的实现变量和方法,所以在.m文件中需要使用#import来包含被引用类的头文件。

3.如果有些文件一次被#import,那么一旦最开始的头文件稍有改动,后面引用到这个文件的所有类都需要从新编译一遍,这样的效率也是可想而知的。而相对来讲,使用@class凡是就不会出现这种问题。

4.内存管理_property 
参数:

(当一个类中的成员变量中有很多的OC对象的是否,这时候对于对象之间的管理内存问题会很麻烦,特别是在setter方法里面,这时候,编译器就引入了property的retain参数,来进行管理内存。

1.retain:如果property里面有retain参数,那么编译器在setter方法里面,编译器会自动加上,先release旧值,然后再retain新的值 
所以,如果你在一个类中定义的是基本数据类型如:@property
int age 
。这时候不需要任何操作,其中已经包含assign操作(直接赋值),但是如果类中定义的是一个OC
对象,那么你需要用retain如:@property  (retain ) Student *stu;

Assign
默认类型,setter方法直接赋值,不进行retain操作。

Readonly 
:只生成getter的方法

Readwirte :setter
getter的方法都生成

copy:setter
方法release
旧值,再copy新值。

atomic默认属性:提供多线程安全。,代表给方法加锁,保证线程安全(耗性能)

nonatomic,代表方法不需要考虑线程安全问题。

注意:基本上所有的属性都是nonatomic类型,不需要考虑atomic,因为性能问题。

property里面还可以指定setter
和getter方法的名字,例如:@property
(setter =  setAge,getter =  getAge) int age; 
这样就指定了setter和getter
方法:

5.自动释放池:

OC里面的一种内存自动回收机制,一般可以将一些临时变量放到自动释放池里面去,统一回收释放

当自动释放池销毁的时候,池里面的所有对象都会调用一次release方法:

OC对象只需要发送一条autorelease
消息,就会把这个对象添加到最近的自动释放池中,(栈顶的释放池)

Autorelease
实际上只是把对release的调用延迟了,对于每一次autorelease
,系统只是把该对象放入了当前autorelease
pool
中,当该pool被释放时,该pool中的所有对象会被调用release。

版权声明:本文为博主原创文章,未经博主允许不得转载。

时间: 2024-12-23 06:13:13

第四天:内存管理-property参数的相关文章

黑马程序员-OC内存管理 @property的增强

涉及到内存管理,只读,多线程等很多功能时,setter和getter方法也就没那么简单了:当然@property依然强大,很好用: 1:内存管理相关参数: *:retain:  (如果是oc对象类型),生成的setter会自动release旧值,retain新值: *:assign:(适用于非oc对象)  这个是默认的值 *:copy:release旧值,copy新值: @property (retain) NSString *name; // 同类型的参数不能同时写 // @property

内存管理-property

序言 上篇文章介绍了内存管理的引用计数机制,也通过代码了解了如何通过引用计数来进行内存管理.这篇文章将介绍一种系统帮我们实现的内存管理机制-属性参数property.在介绍使用属性参数进行内存管理之前,我们来看看属性参数都有哪些以及其作用. 属性参数 声明property的语法为:@property(属性 [, 属性2, ...]) 类型 名称; 属性分为3类: 1.读写属性(Writability)包含:readwrite / readonly 2.setter语义(Setter Semant

cocos2dx 3.1从零学习(四)——内存管理(错误案例分析)

本篇内容文字比较较多,但是这些都是建立在前面三章写代码特别是传值的时候崩溃的基础上的.可能表达的跟正确的机制有出入,还请指正. 如果有不理解的可以联系我,大家可以讨论一下,共同学习. 首先明确一个事实,retain和release是一一对应的,跟new和delete一样. 1.引用计数retain release 这里请参考一下引用计数的书籍,肯定说的比我讲的详细. 简单一点理解就是,对new的指针加一个计数器,每引用一次这块内存,计数就加1.在析构的时候减1,如果等于0的时候就delete这个

[Windows驱动开发](四)内存管理

一.内存管理概念 1. 物理内存概念(Physical Memory Address) PC上有三条总线,分别是数据总线.地址总线和控制总线.32位CPU的寻址能力为4GB(2的32次方)个字节.用户最多可以使用4GB的真实物理内存.PC中很多设备都提供了自己的设备内存.这部分内存会映射到PC的物理内存上,也就是读写这段物理地址,其实读写的是设备内存地址,而不是物理内存地址. 2. 虚拟内存概念 虽然可以寻址4GB的内存,但是PC中往往没有如此多的真实物理内存.操作系统和硬件(主要是CPU中的内

【读书笔记】C#高级编程 第十四章 内存管理和指针

(一)后台内存管理 1.值数据类型 Windows使用一个虚拟寻址系统,该系统把程序可用的内存地址映射到硬件内存中的实际地址,该任务由Windows在后台管理(32位每个进程可使用4GB虚拟内存,64位更多,这个内存包括可执行代码和加载的DLL,以及程序运行时使用的变量内容). 在处理器的虚拟内存中,有一个区域称为栈.栈存储不是对象成员的值数据类型. 释放变量时,其顺序总是与它们分配内存的顺序相反,这就是栈的工作方式. 程序第一次运行时,栈指针指向为栈保留的内存块末尾.栈实际上是向下填充的,即从

oc内存管理总结(一)

**内存管理 问题 1.什么是ios内存管理? 就是在对象不再被使用的时候,把它即时的从内存中清除掉 2.为什么要使用内存管理? 1.严格的内存管理,能够是我们的应用程在性能上有很大的提高 2.如果忽略内存管理,可能导致应用占用内存过高,导致程序崩溃 3.系统判断一个对象是否要被销毁的依据是什么? 每个对象创建出来的时候,都有一个retainCount属性,默认值是1,当retainCount = 0的时候,系统就会将该对像销毁 4.如何使对象的retainCount 值增加? 调用retain

OC-@property内存管理中的参数

//1.生产get与set方法的声明 //2.生成get与set方法的简单实现 /*       - (void)setCar:(Car *)car{ _car = car; } - (Car *)car{ return _car; } */ //3.若果你没有声成名相对象的成员变量,那么他会自动生成一个_开头的成员变量 //@property 参数分为4类 /* 1.与set方法内存管理相关参数 retain: 要生成符合内存管理原则的set方法(应用与对象类型),(只在setter中rele

七.OC基础加强--1.内存管理 2.野指针,内存泄露 3.set方法的内存管理 [email protected]参数 [email protected]和循环retain的使用 6.NSString的内存管理

1,内存管理简单介绍 1,为什么要有内存管理? malloc selloc dealloc```需要回头复习 一般的内存 4s 是512m内存:6 是1024m内存: 当内存过大时,会耗尽内存.出现程序闪退. 2.OC内存管理的范围 : 管理任何继承NSObject的对象,对其他的基本数据类型无效. 3.对象类型是程序运行过程中动态分配的,存储在堆区:内存管理主要是对 堆区中的对象的内存管理. 4.OC内存管理的原理 为了防止内存泄露 对象的引用计数器 : 每个OC对象都有自己的引用计数器,是一

内存管理范围和@property

管理范围: 管理任何继承NSObject的对象,对其他的基本数据类型无 效 本质原因是因为对象和其他数据类型在系统中的存储空间不一样,其它局部变量主要存放于 栈中,而对象存储于堆中,当代码块结束时这个代码块中涉及的所有局部变量会被回收,指 向对象的指针也被回收,此时对象已经没有指针指向,但依然存在于内存中,造成内存泄 露. 内存管理的原则 1)原则  只要还有人在使用某个对象,那么这个对象就不会被回收; 只要你想使用这个对象,那么就应该让这个对象的引用计数器+1; 当你不想使用这个对象时,应该让