ios-oc(基本语法4-内存管理)

内存管理

重写dealloc方法


@implementation Dog

#pragma mark 当一个对象从内存中移除的时候,就会被调用
- (void) dealloc
{
NSLog(@"----Dog被销毁了------");

//一定要调用super的方法,写在该方法的最后
[super dealloc];
}
@end

int main()
{
Dog *dog=[[Dog alloc] init];
[dog release];//回收对象内存,该行过后,dog变为了野指针(指向了不可用内存)

dog =nil;
[dog release]; //给空指针发消息,什么事也不发生
return 0;
}

代码中可以通过 用指针调用retainCount方法来获得对象计数器的值。

成员变量的内存管理(如果成员变量是对象,才需要管理)

1、set方法的管理:*release就得成员变量,retain新的成员变量(需要对新旧成员变量是否相同进行判断)

2、delloc方法的管理:*release当前拥有的成员变量

二、@property参数

在@property后加上参数retain后,编译器即可自动生成含有内存管理的set与get方法的声明与定义。
格式:例:@property(retain) Cat *cat;

参数作用:

1、控制set方法的内存管理

  1>retain: release旧值,ratain新值,对象成员必须为此类型。

  2>assign(默认):直接赋值,不作任何内存管理

  3>copy:

2、控制有没有set方法 和get方法

  1>readwrite(默认):同时生成set方法和get方法。例:@property(retain,readwrite) Cat
*cat;

  2>readonly:只会生成get方法(即只能读取,不能赋值)

3、多线程管理

  1>atomic(默认):性能低。

  2>nonatomic:性能高

4、控制set方法和get方法的名称(即不使用默认方法名)

  1>setter:设置set方法的名称,一定有个冒号

  2>getter:设置get方法的名称

  例;@property(nonatomic,assign,getter=getHeight,setter=setMyHeight:)int
height;//则get方法名为getHeight,set方法名为setMyHeight:

三、autorelease

使用方法:Person *p=[[[Person alloc] init ] autorelease];

autorelease返回对象本身,作用:autorelease会将对象加到池子里去,但是计数器没有改变。注:在池子销毁(即@autoreleasepool结束)时,池子里所有的对象都将做一次release操作(注意并不一定释放,只是计数器减一),ios的池子是由系统自行创建与销毁(系统可能存在多个池子),也可以自己创建池子,所以具体池子的创建与销毁时间不确定,故应该尽量少用autorelease。

苹果官方提供的方法(API):

1>如果方法名不是alloc、new,就不用release或者autorelease,

2>若方法名是 alloc、new,就必须release或者autorelease

ios-oc(基本语法4-内存管理),布布扣,bubuko.com

时间: 2024-11-06 16:12:33

ios-oc(基本语法4-内存管理)的相关文章

iOS经典面试题总结--内存管理

iOS经典面试题总结--内存管理 内存管理 1.什么是ARC? ARC是automatic reference counting自动引用计数,在程序编译时自动加入retain/release.在对象被创建时retain count+1,在对象被release时count-1,当count=0时,销毁对象.程序中加入autoreleasepool对象会由系统自动加上autorelease方法,如果该对象引用计数为0,则销毁.那么ARC是为了解决MRC手动管理内存存在的一些而诞生的. MRC下内存管

iOS学习笔记之ARC内存管理

iOS学习笔记之ARC内存管理 写在前面 ARC(Automatic Reference Counting),自动引用计数,是iOS中采用的一种内存管理方式. 指针变量与对象所有权 指针变量暗含了对其所指向对象的所有权 当某个方法(或函数)有一个指向某个对象的局部变量时,可以称该方法(或函数)拥有该变量所指向的对象,如: int main(int argc, const char * argv[]) { @autoreleasepool { // insert code here... NSSt

iOS: ARC & MRC下string内存管理策略探究

ARC & MRC下string内存管理策略探究 前两天跟同事争论一个关于NSString执行copy操作以后是否会发生变化,两个人整了半天,最后写代码验证了一下,发现原来NSString操作没我们想的那么简单,下面就让我们一起看看NSString和NSMutableString在MRC下执行retain,copy,mutableCopy,以及ARC下不同的修饰__weak, __strong修饰赋值究竟发生了什么. 一.验证代码如下: - (void)testStringAddress { i

iOS技术面试02:内存管理

怎么保证多人开发进行内存泄露的检查. 如何定位内存泄露? 1> 使用Analyze进行代码的静态分析(检测有无潜在的内存泄露) 2> 通过leak检查在程序运行过程中有无内存泄露 3> 为避免不必要的麻烦, 多人开发时尽量使用ARC 2.非自动内存管理情况下怎么做单例模式. 创建单例设计模式的基本步骤 · >声明一个单件对象的静态实例,并初始化为nil. >创建一个类的类工厂方法,当且仅当这个类的实例为nil时生成一个该类的实例 >实现NScopying协议, 覆盖al

OC基础 05-手动内存管理(MRC)

---恢复内容开始--- MRC: Manul(手动) Reference(引用) Counting(计数) 什么是手动引用计数? 所有对象的内容都需要我们手动管理, 需要程序员自己编写release/retain等代码 内存管理的原则就是有加就有减 也就是说, 一次alloc/new/copy对应一次release, 一次retain对应一次relese 内存管理的重要性: 移动设备的内存极其有限,每个app的占用内存也是有限制的. 当我们创建一个OC对象,定义一个变量,调用一个函数或者方法,

OC语法7——内存管理之@property参数

@property的参数: 我们已经知道为了给开发者提供便捷,OC提供了@porperty关键字,它可以自动生成属性的set和get方法. 但是我们又知道,在OC中还面临者对象内存管理的问题,而且我们遵循“谁创建,谁释放”的原则管理内存. 所以我们得重写set方法:把原先的成员变量(对象)release掉,然后给新成员变量retain. 还得重写realloc方法:在realloc中调用release,释放该对象. 呵呵.我们引入@property的目的就是为了让其自动生成set和get方法的,

iOS开发之oc(十一)--内存管理MRC

掌握内容 >理解内存管理的原理 >掌握手动内存管理MRC >掌握内存管理在实际工程中的使用 (一) 1.理解部分 1.1内存管理 (传统内存管理demo) 1.1.1内存管理做了一件什么事? 内存管理就是确保开辟的堆空间得到正确的释放 如果堆空间没有释放,称为内存泄露 使用已释放的堆空间,称为提前释放 重复释放同一个空间,称为重复释放 1.1.2传统内存管理的困境 (1)当我们要释放一个堆,首先要确定使用这个堆的指针,都访问完毕,避免提前释放. (2)释放指针指向的堆空间,首先要确定那些

黑马程序员---OC基础6【内存管理】【手动内存管理】【单、多个对象的内存管理】【*@property参数】【@class的使用】【NSString类的内存管理】【autorelease使用】

------- iOS培训.Android培训.Java培训.期待与您交流! ---------- [内存管理] 1.内存管理概念 由于移动设备内存及其有限,所以每个app所占的内存也是有限的 需要回收一些不使用的空间 2.OC内存管理的范围 管理任何继承NSOject的对象,对其他的基本数据类型无效 主要管理堆区中的对象的内存管理   3.内存管理的原理 1)对象所有权概念 任何对象都可以能拥有一个或多个所有者,只要一个对象至少还拥有一个所有者,他就会继续存在 cocoasu所有权策略 任何自

OC加强(一)之内存管理

1.为什么要进行内存管理? 由于移动设备的内存极其有限,所以每个APP所占的内存也是有限制的,当app所占用的内存 较多时,系统就会发出内存警告,一个app可用的内存是被限制的,如果一个app使用的内存超 过20M,则系统会向该app发送Memory Warning消息.收到此消息后,需要回收一些不需要再 继续使用的内存空间,比如回收一些不再使用的对象和变量等,否则程序会崩溃. 这里首先要解释一个常识概念:内存,存储空间,各自的功能? 内存:我们一般说的手机内存其实是指运行内存,,简称运存,即 

23-黑马程序员------OC 语言学习笔记---内存管理

黑马程序员------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 对于面向对象的变成语言,程序需要不断地创建对象.初始,创建的所有程序通常都有指针指向它,程序可能需要访问这些对象的实例变量或调用这些对象的方法,随着程序的不断执行,程序再次创建了一些新的对象,而那些老的对象已经不会再被调用,也不