14-ARC自动引用内存使用及管理机制
2015-01-22 15:57
621 查看
// main.m
// ARC的基本使用
//
// Created by amesty on 15-1-8.
// Copyright (c) 2015年 itcast. All rights reserved.
//
/* ARC的基本原理
(一)ARC的判断准则:
只要没有强指针指向对象,对象就会被释放。
(二)指针分类:
(1)强指针:默认的情况下,所有的指针都是强指针,关键字_strong(如果没有强指针指向对象,对象就会自动被清空)
(2)弱指针:__weak关键字修饰的指针(只要弱指针指向的对象不在了,就直接把弱指针做清空操作)
声明一个弱指针如下:
_weak Person *p;
ARC中,只要弱指针指向的对象不在了,就直接把弱指针做清空操作。
_weak Person *p=[[Person alloc] init];//不合理,对象一创建出来就被释放掉,对象释放掉后,ARC把指针自动清零。
ARC中在property处不再使用retain,而是使用strong,在dealloc中不需要再[super
dealloc]。
@property(nonatomic,strong)Dog *dog;// 意味着生成的成员变量_dog是一个强指针,相当于以前的retain。
如果换成是弱指针,则换成weak,不需要加_ _。
(三)ARC的特点总结:以前的retain改成strong
(1)不允许调用release,retain,retainCount
(2)允许重写dealloc,但是不允许调用[super dealloc]
(3)@property的参数:
Strong:相当于原来的retain(适用于OC对象类型),成员变量是强指针
Weak:相当于原来的assign,(适用于oc对象类型),成员变量是弱指针
Assign:适用于非OC对象类型(基础类型)
*/
#import <Foundation/Foundation.h>
#import"Person.h"
#import "Dog.h"
int main(int argc, const char * argv[])
{
Dog *d=[[Dog alloc]init];
Person *p=[[Person alloc]init];
p.dog=d;
d=nil;
NSLog(@"%@",p.dog);
return 0;
}
void weekpointtest()
{
//不合理,对象一创建出来就被释放掉,对象释放掉后,ARC把指针自动清零。
__weak Person *p=[[Person alloc] init];
NSLog(@"-------");
NSLog(@"%@",p);
}
=================
// Person.h
// ARC的基本使用
//
// Created by amesty on 15-1-8.
// Copyright (c) 2015年 itcast. All rights reserved.
//
#import <Cocoa/Cocoa.h>
@class Dog;
@interface Person : NSObject
@property (nonatomic,strong)Dog * dog;
@property(nonatomic,strong)NSString * name;
+(void)dealloc;
@end
====================
// Person.m
// ARC的基本使用
//
// Created by amesty on 15-1-8.
// Copyright (c) 2015年 itcast. All rights reserved.
//
#import "Person.h"
@implementation Person
+(void)dealloc
{
NSLog(@"Person对象被释放");
[super dealloc];
}
@end
==================
// Dog.h
// ARC的基本使用
//
// Created by amesty on 15-1-8.
// Copyright (c) 2015年 itcast. All rights reserved.
//
#import "Person.h"
@interface Dog : NSObject
@end
====================
// Dog.m
// ARC的基本使用
//
// Created by amesty on 15-1-8.
// Copyright (c) 2015年 itcast. All rights reserved.
//
#import "Dog.h"
@implementation Dog
@end
=================================
// main.m
// ARC内存管理机制
//
// Created by amesty on 15-1-8.
// Copyright (c) 2015年 itcast. All rights reserved.
//
/*
1.autorelease的基本用法
1> 会将对象放到一个自动释放池中
2> 当自动释放池被销毁时,会对池子里面的所有对象做一次release操作
3> 会返回对象本身
4> 调用完autorelease方法后,对象的计数器不变
2.autorelease的好处
1> 不用再关心对象释放的时间
2> 不用再关心什么时候调用release
3.autorelease使用注意
1> 占用内存较大的对象不要随便使用autorelease
2> 占用内存较小的对象使用autorelease,没有太大影响
4.错误写法
1> alloc之后调用了autorelease,又调用release
@autoreleasepool {
Person *p = [[[Person alloc] init] autorelease];
[p release];
}
2> 连续调用多次autorelease
@autoreleasepool {
Person *p = [[[[Person alloc] init] autorelease] autorelease];
}
5.自动释放池
1> 在iOS程序运行过程中,会创建无数个池子。这些池子都是以栈结构存在(先进后出)
2> 当一个对象调用autorelease方法时,会将这个对象放到栈顶的释放池
6.自动释放池的创建方式
1> iOS 5.0前(NSAutoreleasePool)
2> iOS 5.0后(@autorelease)
1.系统自带的方法里面没有包含alloc、new、copy,说明返回的对象都是autorelease的
2.开发过程中经常会提供一些类方法,快速创建一个已经autorelease过的对象
1> 创建对象时不要直接用类名,一般用self
+ (id)person
{
return [[[self alloc] init] autorelease];
}
*/
#import <Foundation/Foundation.h>
#import"Person.h"
#import "RichPerson.h"
int main(int argc, const char * argv[])
{
@autoreleasepool{
RichPerson *p=[RichPerson personWithAge:10];
p.money=100;
}
return 0;
}
void test()
{
@autoreleasepool { //开始代表创建了释放池
//autorelease方法会返回对象本身 池子是用栈这种数据结构存放数据内容的(先进后出)
//autorelease会将对象放在一个自动释放池中
//当自动释放池被销毁时,会对池子里面的所有对象做一次release操作
Person *p=[[[Person alloc]init] autorelease];
p.age=10;
// insert code here...
NSLog(@"Hello, World!");
@autoreleasepool
{
Person *p2=[[[Person alloc]init] autorelease];
p2.age=20;
}
} //结束代表销毁释放池
}
void test2()
{
@autoreleasepool
{
Person *p =[[[Person alloc] init] autorelease];
}
NSLog(@"test");
}
void test3()
{
@autoreleasepool {
Person *p=[Person Person];
p.age=100;
Person *p1=[Person personWithAge:200];
NSLog(@"Hello, World!");
}
}
==========
//
// Person.h
// ARC内存管理机制
//
// Created by amesty on 15-1-8.
// Copyright (c) 2015年 itcast. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property(nonatomic,assign)int age;
+(id)Person;
+(id)personWithAge:(int)age;
@end
=================
//
// Person.m
// ARC内存管理机制
//
// Created by amesty on 15-1-8.
// Copyright (c) 2015年 itcast. All rights reserved.
//
#import "Person.h"
/*
1.系统自带的方法里面没有包含alloc、new、copy,说明返回的对象都是autorelease的
2.开发过程中经常会提供一些类方法,快速创建一个已经autorelease过的对象
1> 创建对象时不要直接用类名,一般用self
+ (id)person
{
return [[[self alloc] init] autorelease];
}
*/
@implementation Person
-(void)dealloc
{
NSLog(@"%d对象销毁",_age);
[super dealloc];
}
+(id)Person;
{ //这样改写之后谁调用就创建什么样的对象,而不是限定于给类本身,任何子类可以据此创建子类对象呢。
//return [[[Person alloc]init]autorelease];
return [[[self alloc]init]autorelease];
}
+(id)personWithAge:(int)age
{
// Person * p1=[[[Person alloc]init]autorelease];
Person * p1=[self Person];
p1.age=age;
return p1;
}
@end
=======================
// RichPerson.h
// ARC内存管理机制
//
// Created by amesty on 15-1-8.
// Copyright (c) 2015年 itcast. All rights reserved.
//
#import "Person.h"
@interface RichPerson : Person
@property (nonatomic,assign) int money;
@end
================
// RichPerson.m
// ARC内存管理机制
//
// Created by amesty on 15-1-8.
// Copyright (c) 2015年 itcast. All rights reserved.
//
#import "RichPerson.h"
@implementation RichPerson
@end
// ARC的基本使用
//
// Created by amesty on 15-1-8.
// Copyright (c) 2015年 itcast. All rights reserved.
//
/* ARC的基本原理
(一)ARC的判断准则:
只要没有强指针指向对象,对象就会被释放。
(二)指针分类:
(1)强指针:默认的情况下,所有的指针都是强指针,关键字_strong(如果没有强指针指向对象,对象就会自动被清空)
(2)弱指针:__weak关键字修饰的指针(只要弱指针指向的对象不在了,就直接把弱指针做清空操作)
声明一个弱指针如下:
_weak Person *p;
ARC中,只要弱指针指向的对象不在了,就直接把弱指针做清空操作。
_weak Person *p=[[Person alloc] init];//不合理,对象一创建出来就被释放掉,对象释放掉后,ARC把指针自动清零。
ARC中在property处不再使用retain,而是使用strong,在dealloc中不需要再[super
dealloc]。
@property(nonatomic,strong)Dog *dog;// 意味着生成的成员变量_dog是一个强指针,相当于以前的retain。
如果换成是弱指针,则换成weak,不需要加_ _。
(三)ARC的特点总结:以前的retain改成strong
(1)不允许调用release,retain,retainCount
(2)允许重写dealloc,但是不允许调用[super dealloc]
(3)@property的参数:
Strong:相当于原来的retain(适用于OC对象类型),成员变量是强指针
Weak:相当于原来的assign,(适用于oc对象类型),成员变量是弱指针
Assign:适用于非OC对象类型(基础类型)
*/
#import <Foundation/Foundation.h>
#import"Person.h"
#import "Dog.h"
int main(int argc, const char * argv[])
{
Dog *d=[[Dog alloc]init];
Person *p=[[Person alloc]init];
p.dog=d;
d=nil;
NSLog(@"%@",p.dog);
return 0;
}
void weekpointtest()
{
//不合理,对象一创建出来就被释放掉,对象释放掉后,ARC把指针自动清零。
__weak Person *p=[[Person alloc] init];
NSLog(@"-------");
NSLog(@"%@",p);
}
=================
// Person.h
// ARC的基本使用
//
// Created by amesty on 15-1-8.
// Copyright (c) 2015年 itcast. All rights reserved.
//
#import <Cocoa/Cocoa.h>
@class Dog;
@interface Person : NSObject
@property (nonatomic,strong)Dog * dog;
@property(nonatomic,strong)NSString * name;
+(void)dealloc;
@end
====================
// Person.m
// ARC的基本使用
//
// Created by amesty on 15-1-8.
// Copyright (c) 2015年 itcast. All rights reserved.
//
#import "Person.h"
@implementation Person
+(void)dealloc
{
NSLog(@"Person对象被释放");
[super dealloc];
}
@end
==================
// Dog.h
// ARC的基本使用
//
// Created by amesty on 15-1-8.
// Copyright (c) 2015年 itcast. All rights reserved.
//
#import "Person.h"
@interface Dog : NSObject
@end
====================
// Dog.m
// ARC的基本使用
//
// Created by amesty on 15-1-8.
// Copyright (c) 2015年 itcast. All rights reserved.
//
#import "Dog.h"
@implementation Dog
@end
=================================
// main.m
// ARC内存管理机制
//
// Created by amesty on 15-1-8.
// Copyright (c) 2015年 itcast. All rights reserved.
//
/*
1.autorelease的基本用法
1> 会将对象放到一个自动释放池中
2> 当自动释放池被销毁时,会对池子里面的所有对象做一次release操作
3> 会返回对象本身
4> 调用完autorelease方法后,对象的计数器不变
2.autorelease的好处
1> 不用再关心对象释放的时间
2> 不用再关心什么时候调用release
3.autorelease使用注意
1> 占用内存较大的对象不要随便使用autorelease
2> 占用内存较小的对象使用autorelease,没有太大影响
4.错误写法
1> alloc之后调用了autorelease,又调用release
@autoreleasepool {
Person *p = [[[Person alloc] init] autorelease];
[p release];
}
2> 连续调用多次autorelease
@autoreleasepool {
Person *p = [[[[Person alloc] init] autorelease] autorelease];
}
5.自动释放池
1> 在iOS程序运行过程中,会创建无数个池子。这些池子都是以栈结构存在(先进后出)
2> 当一个对象调用autorelease方法时,会将这个对象放到栈顶的释放池
6.自动释放池的创建方式
1> iOS 5.0前(NSAutoreleasePool)
2> iOS 5.0后(@autorelease)
1.系统自带的方法里面没有包含alloc、new、copy,说明返回的对象都是autorelease的
2.开发过程中经常会提供一些类方法,快速创建一个已经autorelease过的对象
1> 创建对象时不要直接用类名,一般用self
+ (id)person
{
return [[[self alloc] init] autorelease];
}
*/
#import <Foundation/Foundation.h>
#import"Person.h"
#import "RichPerson.h"
int main(int argc, const char * argv[])
{
@autoreleasepool{
RichPerson *p=[RichPerson personWithAge:10];
p.money=100;
}
return 0;
}
void test()
{
@autoreleasepool { //开始代表创建了释放池
//autorelease方法会返回对象本身 池子是用栈这种数据结构存放数据内容的(先进后出)
//autorelease会将对象放在一个自动释放池中
//当自动释放池被销毁时,会对池子里面的所有对象做一次release操作
Person *p=[[[Person alloc]init] autorelease];
p.age=10;
// insert code here...
NSLog(@"Hello, World!");
@autoreleasepool
{
Person *p2=[[[Person alloc]init] autorelease];
p2.age=20;
}
} //结束代表销毁释放池
}
void test2()
{
@autoreleasepool
{
Person *p =[[[Person alloc] init] autorelease];
}
NSLog(@"test");
}
void test3()
{
@autoreleasepool {
Person *p=[Person Person];
p.age=100;
Person *p1=[Person personWithAge:200];
NSLog(@"Hello, World!");
}
}
==========
//
// Person.h
// ARC内存管理机制
//
// Created by amesty on 15-1-8.
// Copyright (c) 2015年 itcast. All rights reserved.
//
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property(nonatomic,assign)int age;
+(id)Person;
+(id)personWithAge:(int)age;
@end
=================
//
// Person.m
// ARC内存管理机制
//
// Created by amesty on 15-1-8.
// Copyright (c) 2015年 itcast. All rights reserved.
//
#import "Person.h"
/*
1.系统自带的方法里面没有包含alloc、new、copy,说明返回的对象都是autorelease的
2.开发过程中经常会提供一些类方法,快速创建一个已经autorelease过的对象
1> 创建对象时不要直接用类名,一般用self
+ (id)person
{
return [[[self alloc] init] autorelease];
}
*/
@implementation Person
-(void)dealloc
{
NSLog(@"%d对象销毁",_age);
[super dealloc];
}
+(id)Person;
{ //这样改写之后谁调用就创建什么样的对象,而不是限定于给类本身,任何子类可以据此创建子类对象呢。
//return [[[Person alloc]init]autorelease];
return [[[self alloc]init]autorelease];
}
+(id)personWithAge:(int)age
{
// Person * p1=[[[Person alloc]init]autorelease];
Person * p1=[self Person];
p1.age=age;
return p1;
}
@end
=======================
// RichPerson.h
// ARC内存管理机制
//
// Created by amesty on 15-1-8.
// Copyright (c) 2015年 itcast. All rights reserved.
//
#import "Person.h"
@interface RichPerson : Person
@property (nonatomic,assign) int money;
@end
================
// RichPerson.m
// ARC内存管理机制
//
// Created by amesty on 15-1-8.
// Copyright (c) 2015年 itcast. All rights reserved.
//
#import "RichPerson.h"
@implementation RichPerson
@end
相关文章推荐
- 大多数情况下使用ARC内存自动管理机制,特殊情况采用MRC手动管理
- Java自动内存管理机制(三) 对象、引用
- .NET Framework 自动内存管理机制深入剖析 (C#分析篇) 读了三遍回味无穷
- .NET Framework 自动内存管理机制深入剖析 (C#分析篇)
- IOS开发---OC语言-㉗内存管理ARC的基本使用
- iOS 非ARC基本内存管理系列 2-多对象内存管理(3) 利用@property来自动管理内存
- 黑马程序员--OC内存管理机制(下)之ARC
- 【Java自动内存管理机制】
- ARC内存管理机制详解
- ARC内存管理机制详解
- .NET Framework 自动内存管理机制深入剖析 (C#分析篇)
- ios 自动内存管理 ARC
- .NET Framework 自动内存管理机制深入剖析 (转载)
- iOS开发自动释放池@autoreleasepool的使用注意事项以及ARC机制——面试必考内容
- 学习笔记:Objective C 的内存管理(4)----ARC内存管理机制
- 深入理解JVM学习笔记-自动内存管理机制
- ARC/OC对象自动管理内存
- (转).NET Framework 自动内存管理机制深入剖析 (C#分析篇)
- iOS 非ARC基本内存管理系列 1-引用计数器
- 【iOS开发-35】有了ARC内存管理机制,是否还须要操心内存溢出等问题?——面试必备