内存管理
2015-07-27 21:11
211 查看
#import <Foundation/Foundation.h>
#import "Girl.h"
#import "Boy.h"
#import "Person.h"
int main(int argc,
const char * argv[]) {
// Girl *girl = [[Girl alloc]init];
// Boy *boy =[[Boy alloc] init];
// girl.delegate = boy;
// [girl getMarry];
//内存溢出
没有释放
//野指针异常
对系统释放的内存进行访问
// Manual Reference Count,人⼯引用计数
//管理内存有三种方式
//1.垃圾回收,java常见的管理方法,系统来检测对象是否被用,是否被释放
//2.MRC手动引用计数,ios管理内存的方式
//3.ARC自动引用计数
// //对象被创建出来之后他的引用计数retainCount就变成1
// Boy *boy = [[Boy alloc] init];
// NSLog(@"%ld", boy.retainCount);
////
////
//// //retain:对对象的引用计数加1
// [boy retain];
// NSLog(@"%ld", boy.retainCount);
// [boy retain];
// [boy retain];
// NSLog(@"%ld", boy.retainCount);
//
// //release对对象的引用计数-1
// [boy release];
// NSLog(@"%ld", boy.retainCount);
// [boy release];
// [boy release];
// NSLog(@"%ld", boy.retainCount);
// [boy release];
// NSLog(@"%ld", boy.retainCount);
// //当对象的引用计数1 -> 0的时候,会自动调用dealloc,dealloc才是对应对象释放的方法
// NSLog(@"%ld", boy.retainCount);
//当对象调用release的时候,他的引用计数是1,这个对象就不在对他的引用计数进行-1,而是直接调用dealloc方法,所以我们再访问对象的引用计数还是1
//如果多次对对象进行释放,会造成过度释放,过度释放也是常见的内存问题
// NSArray *arr = @[@"1",@"2",@"3",@"4"];
// NSLog(@"%ld", arr.retainCount);
//
// NSString *str = @"11111";
// NSLog(@"%ld", str.retainCount);
//
// NSMutableString *str2 = [NSMutableString stringWithString:@"111111"];
// NSLog(@"%ld", str2.retainCount);
//
// NSDictionary *dic = @{@"1":@"2",@"3":@"4"};
// NSLog(@"%ld", dic.retainCount);
//
// NSLog(@"%p", str);
// NSLog(@"%p", str2);
// NSString的对在全局静态区,他的引用计数是-1,代表正整数的最大值,其他的对象都在堆区
// Boy *boy = [[Boy alloc] init];
// [boy retain];
// [boy retain];
// NSLog(@"%ld", boy.retainCount);
//
// [boy release];//release马上会把对象的引用计数-1
// NSLog(@"%ld", boy.retainCount);
//
// [boy autorelease];//autorelease会延迟对对象的计数-1
// NSLog(@"%ld", boy.retainCount);
//自动释放池
//只要对象用autorelease释放会把对象放到系统的自动释放池,等出了池子的范围,对象引用计数自动-1,这个相当于java的垃圾回收,对对象释放油系统来管理
// @autoreleasepool {
// [boy autorelease];
// NSLog(@"%ld", boy.retainCount);
// }
//
// NSLog(@"%ld", boy.retainCount);
//内存管理的原则:加多少,对应减多少
//对象的所有权:拥有所有权的对象可以对他进行release
//
// Boy *b = [Boy boy];
// [b retain];
// NSLog(@"%ld", b.retainCount);
// [b release];
// //对象若果是我们进行的alloc或者retain之后我们就获得了对象的所有权就可以对对象进行release操作
//
// //遍历构造器在返回对象的时候会加上一个autorelese所以用便利构造器创建对象不需要对内存进行管理
// NSArray *arr1 = [[NSArray alloc] initWithObjects:@"1",@"2", nil];
// NSLog(@"%ld", arr1.retainCount);
//id是泛型指针,可以用在任何的方法中,但是instancetype代表实例类型,uyongzai自定义初始化方法,便利构造器作为返回值类型使用,标识方法会返回一个对象回去
// NSArray *arr = @[@"1",@"2",@"3",@"4"];
// NSLog(@"%ld", arr.retainCount);
//
// NSArray *newArr = [arr copy];
// NSLog(@"%@", newArr);
//
// NSArray *arr1 = [NSArray arrayWithArray:arr];
// NSLog(@"%@", arr1);
//
// NSLog(@"%ld", newArr.retainCount);
//不可变 ->
可变
// NSMutableArray *arr1 = [NSMutableArray arrayWithArray:arr];
// [arr1 addObject:@"6"];
// NSLog(@"%@",arr1);
//
// NSMutableArray *arr2 = [arr mutableCopy];
// NSLog(@"%@", arr2);
//
// [arr2 addObject:@"5"];
// NSLog(@"%@", arr2);
//
// NSDictionary *dic = @{@"1":@"2",@"3":@"4"};
// NSMutableDictionary *muDic = [dic mutableCopy];
// NSLog(@"%@", muDic);
//
// //系统的列要是实现copy的功能必须先签订NSCopying的协议燃火实现对应的方法
// //不可变的数组字典可以通过mutableCopy变成可变的
// //mutableCopy出来的对象是可变的
//
// Boy *boy = [Boy boyWithName:@"张阳阳" hobby:@"玩"];
// Boy *newBoy = [boy copy];
// NSLog(@"%@", newBoy.name);
// //如果自己的类想要实现copy的功能,就必须签订NSCopying,然后实现相应的协议方法initWithZone,之后就可以使用copy的功能
//
// NSLog(@"%ld", boy.retainCount);
// NSLog(@"%ld", newBoy.retainCount);
//copy也可以改变引用计数,但是他改变的是新对象的引用计数,而原先的对象计数不变
//alloc开辟 dealloc
释放
// Boy *boy1 = [[Boy alloc] init];
// [boy1 retain];
// [boy1 retain];
// NSLog(@"%ld", boy1.retainCount);
// NSMutableArray *arr = [NSMutableArray arrayWithObjects:boy1, nil];
// NSLog(@"%ld", [arr[0] retainCount]);
//
// [arr removeObjectAtIndex:0];
// NSLog(@"%ld", boy1.retainCount);
//当对象放入到容器Array或者字典中,对象会被容器进行一次持有,就是return一次,他的引用计数会加1,主要为了防止空指针的问题
//等对象从容器中移除掉,相应的会减1
//
// Boy *b = [[Boy alloc] init];
// NSArray *arr = @[b];
// [b release];
//
// Boy *b = [[Boy alloc] init];
// Girl *girl = [[Girl alloc] init];
// b.girls = girl;
// NSLog(@"%ld", girl.retainCount);
// // 完整的类
// Person *per = [[Person alloc] initWithName:@"张阳阳" age:20];
// [per.arr addObject:@"1"];
// NSLog(@"%@", per.arr);
// Boy.h
// OC08,09_内存管理
//
// Created by dllo on 15/7/27.
// Copyright (c) 2015年 dllo. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Girl.h"
@interface Boy :
NSObject<GirlDelegate,NSCopying>
@property(nonatomic,retain)NSString *name;
@property(nonatomic,copy)NSString *hobby;
@property(nonatomic,retain)Girl *girls;
//自定义的初始化方法
- (instancetype)initWithName:(NSString *)name
hobby:(NSString *)hobby;
+ (Boy *)boyWithName:(NSString *)name
hobby:(NSString *)hobby;
// Boy.m
// OC08,09_内存管理
//
// Created by dllo on 15/7/27.
// Copyright (c) 2015年 dllo. All rights reserved.
//
#import "Boy.h"
@implementation Boy
- (void)cook{
NSLog(@"吃吃吃");
}
- (void)dealloc{
NSLog(@"对象被释放了");
//把成员变量里+1的操作全部减去
[_name
release];
[_girls
release];
[_hobby
release];
[super
dealloc];
}
+ (Boy *)boy;
#import "Girl.h"
#import "Boy.h"
#import "Person.h"
int main(int argc,
const char * argv[]) {
// Girl *girl = [[Girl alloc]init];
// Boy *boy =[[Boy alloc] init];
// girl.delegate = boy;
// [girl getMarry];
//内存溢出
没有释放
//野指针异常
对系统释放的内存进行访问
// Manual Reference Count,人⼯引用计数
//管理内存有三种方式
//1.垃圾回收,java常见的管理方法,系统来检测对象是否被用,是否被释放
//2.MRC手动引用计数,ios管理内存的方式
//3.ARC自动引用计数
// //对象被创建出来之后他的引用计数retainCount就变成1
// Boy *boy = [[Boy alloc] init];
// NSLog(@"%ld", boy.retainCount);
////
////
//// //retain:对对象的引用计数加1
// [boy retain];
// NSLog(@"%ld", boy.retainCount);
// [boy retain];
// [boy retain];
// NSLog(@"%ld", boy.retainCount);
//
// //release对对象的引用计数-1
// [boy release];
// NSLog(@"%ld", boy.retainCount);
// [boy release];
// [boy release];
// NSLog(@"%ld", boy.retainCount);
// [boy release];
// NSLog(@"%ld", boy.retainCount);
// //当对象的引用计数1 -> 0的时候,会自动调用dealloc,dealloc才是对应对象释放的方法
// NSLog(@"%ld", boy.retainCount);
//当对象调用release的时候,他的引用计数是1,这个对象就不在对他的引用计数进行-1,而是直接调用dealloc方法,所以我们再访问对象的引用计数还是1
//如果多次对对象进行释放,会造成过度释放,过度释放也是常见的内存问题
// NSArray *arr = @[@"1",@"2",@"3",@"4"];
// NSLog(@"%ld", arr.retainCount);
//
// NSString *str = @"11111";
// NSLog(@"%ld", str.retainCount);
//
// NSMutableString *str2 = [NSMutableString stringWithString:@"111111"];
// NSLog(@"%ld", str2.retainCount);
//
// NSDictionary *dic = @{@"1":@"2",@"3":@"4"};
// NSLog(@"%ld", dic.retainCount);
//
// NSLog(@"%p", str);
// NSLog(@"%p", str2);
// NSString的对在全局静态区,他的引用计数是-1,代表正整数的最大值,其他的对象都在堆区
// Boy *boy = [[Boy alloc] init];
// [boy retain];
// [boy retain];
// NSLog(@"%ld", boy.retainCount);
//
// [boy release];//release马上会把对象的引用计数-1
// NSLog(@"%ld", boy.retainCount);
//
// [boy autorelease];//autorelease会延迟对对象的计数-1
// NSLog(@"%ld", boy.retainCount);
//自动释放池
//只要对象用autorelease释放会把对象放到系统的自动释放池,等出了池子的范围,对象引用计数自动-1,这个相当于java的垃圾回收,对对象释放油系统来管理
// @autoreleasepool {
// [boy autorelease];
// NSLog(@"%ld", boy.retainCount);
// }
//
// NSLog(@"%ld", boy.retainCount);
//内存管理的原则:加多少,对应减多少
//对象的所有权:拥有所有权的对象可以对他进行release
//
// Boy *b = [Boy boy];
// [b retain];
// NSLog(@"%ld", b.retainCount);
// [b release];
// //对象若果是我们进行的alloc或者retain之后我们就获得了对象的所有权就可以对对象进行release操作
//
// //遍历构造器在返回对象的时候会加上一个autorelese所以用便利构造器创建对象不需要对内存进行管理
// NSArray *arr1 = [[NSArray alloc] initWithObjects:@"1",@"2", nil];
// NSLog(@"%ld", arr1.retainCount);
//id是泛型指针,可以用在任何的方法中,但是instancetype代表实例类型,uyongzai自定义初始化方法,便利构造器作为返回值类型使用,标识方法会返回一个对象回去
// NSArray *arr = @[@"1",@"2",@"3",@"4"];
// NSLog(@"%ld", arr.retainCount);
//
// NSArray *newArr = [arr copy];
// NSLog(@"%@", newArr);
//
// NSArray *arr1 = [NSArray arrayWithArray:arr];
// NSLog(@"%@", arr1);
//
// NSLog(@"%ld", newArr.retainCount);
//不可变 ->
可变
// NSMutableArray *arr1 = [NSMutableArray arrayWithArray:arr];
// [arr1 addObject:@"6"];
// NSLog(@"%@",arr1);
//
// NSMutableArray *arr2 = [arr mutableCopy];
// NSLog(@"%@", arr2);
//
// [arr2 addObject:@"5"];
// NSLog(@"%@", arr2);
//
// NSDictionary *dic = @{@"1":@"2",@"3":@"4"};
// NSMutableDictionary *muDic = [dic mutableCopy];
// NSLog(@"%@", muDic);
//
// //系统的列要是实现copy的功能必须先签订NSCopying的协议燃火实现对应的方法
// //不可变的数组字典可以通过mutableCopy变成可变的
// //mutableCopy出来的对象是可变的
//
// Boy *boy = [Boy boyWithName:@"张阳阳" hobby:@"玩"];
// Boy *newBoy = [boy copy];
// NSLog(@"%@", newBoy.name);
// //如果自己的类想要实现copy的功能,就必须签订NSCopying,然后实现相应的协议方法initWithZone,之后就可以使用copy的功能
//
// NSLog(@"%ld", boy.retainCount);
// NSLog(@"%ld", newBoy.retainCount);
//copy也可以改变引用计数,但是他改变的是新对象的引用计数,而原先的对象计数不变
//alloc开辟 dealloc
释放
// Boy *boy1 = [[Boy alloc] init];
// [boy1 retain];
// [boy1 retain];
// NSLog(@"%ld", boy1.retainCount);
// NSMutableArray *arr = [NSMutableArray arrayWithObjects:boy1, nil];
// NSLog(@"%ld", [arr[0] retainCount]);
//
// [arr removeObjectAtIndex:0];
// NSLog(@"%ld", boy1.retainCount);
//当对象放入到容器Array或者字典中,对象会被容器进行一次持有,就是return一次,他的引用计数会加1,主要为了防止空指针的问题
//等对象从容器中移除掉,相应的会减1
//
// Boy *b = [[Boy alloc] init];
// NSArray *arr = @[b];
// [b release];
//
// Boy *b = [[Boy alloc] init];
// Girl *girl = [[Girl alloc] init];
// b.girls = girl;
// NSLog(@"%ld", girl.retainCount);
// // 完整的类
// Person *per = [[Person alloc] initWithName:@"张阳阳" age:20];
// [per.arr addObject:@"1"];
// NSLog(@"%@", per.arr);
// Boy.h
// OC08,09_内存管理
//
// Created by dllo on 15/7/27.
// Copyright (c) 2015年 dllo. All rights reserved.
//
#import <Foundation/Foundation.h>
#import "Girl.h"
@interface Boy :
NSObject<GirlDelegate,NSCopying>
@property(nonatomic,retain)NSString *name;
@property(nonatomic,copy)NSString *hobby;
@property(nonatomic,retain)Girl *girls;
//自定义的初始化方法
- (instancetype)initWithName:(NSString *)name
hobby:(NSString *)hobby;
+ (Boy *)boyWithName:(NSString *)name
hobby:(NSString *)hobby;
// Boy.m
// OC08,09_内存管理
//
// Created by dllo on 15/7/27.
// Copyright (c) 2015年 dllo. All rights reserved.
//
#import "Boy.h"
@implementation Boy
- (void)cook{
NSLog(@"吃吃吃");
}
- (void)dealloc{
NSLog(@"对象被释放了");
//把成员变量里+1的操作全部减去
[_name
release];
[_girls
release];
[_hobby
release];
[super
dealloc];
}
+ (Boy *)boy;
/Users/dllo/Desktop/c3循环结构/OC08,09_内存管理/OC08,09_内存管理副本.xcodeproj
相关文章推荐
- 试解释操作系统原理中的作业,进程,线程,管程各自的定义。进程间的通信如何实现?
- PLSQL Developer常用设置及快捷键
- HDU3746 Cyclic Nacklace(KMP_Next的应用)
- 串的模式匹配
- 增强for循环
- 排序算法 java实现2
- Scala 深入浅出实战经典 第42讲:scala 泛型类,泛型函数,泛型在spark中的广泛应用
- #10
- UVa 12716 - GCD XOR(筛选+规律)
- poj 2594 Treasure Exploration 二分图匹配
- eclipse完全支持jsp页面下HTML/JS/CSS智能提示
- 常用集合类
- nyoj-02 括号配对问题
- deep learning入门教材
- java内部类,异常--09
- android 常见分辨率(mdpi、hdpi 、xhdpi、xxhdpi )
- 搭建SVN
- QPropertyAnimation动画的控件看不到以及构造函数的属性如何来
- BZOJ 3122 SDOI2013 随机数发生器 数论 EXBSGS
- 可变参数:参数可变