您的位置:首页 > 移动开发 > Objective-C

OC语法<4.5> Foundation框架中-集合的内存管理和集合之间的相互转换

2014-12-14 17:52 543 查看
一:集合的内存管理                                                                                                                                   

集合类中的内存管理都是一个模式的,以下面就以数组为例;

①:首先调成手动内存管理模式

②:创建一个person对象

本节小节知识点:

1:当我们把一个对象存入到数组的时候,数组会对这个对象进行一次retain操作
2:当我们把一个对象移除到数组中的时候,数组会对这个对象会进行一次release操作
3:当对象被销毁的时候,会对内部所有的对象进行一次release操作

#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
//集合类都是一样的,以数组为例
@autoreleasepool {
Person *person = [[Person alloc]init];
NSMutableArray * muArray = [[NSMutableArray alloc]init];

//当我们把一个对象存入到数组的时候,数组会对这个对象进行一次retain操作
[muArray addObject:person];

/*
//当我们把一个对象移除到数组中的时候,数组会对这个对象会进行一次release操作
[muArray removeObject:person];
//removeAllObjects会对数组中所有对象,进行一次release操作(跟autorelease有点像);
[muArray removeAllObjects];
*/

//当对象被销毁的时候,会对内部所有的对象进行一次release操作;

NSLog(@" retaincount %zi",person.retainCount);//2
[muArray release];
NSLog(@" retaincount %zi",person.retainCount);//1
[person release];
NSLog(@" retaincount %zi",person.retainCount);
}
return 0;
}

二:ARC机制下的内存管理                                                                                                                        

ARC机制下是否担心内存泄露呢?
本节知识点:
1:当一个对象被存入集合的时候,默认会保存它的强指针
2:当一个对象从集合中删除的时候,会释放掉这个强指针

#import <Foundation/Foundation.h>
#import "Person.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
Person *person = [[Person alloc]init];
NSMutableArray *muArray = [[NSMutableArray alloc]init];
//当一个对象被存入集合的时候,默认会保存它的强指针,就是说以本例为例,现在数组中添加一个person对象,那么你把person设置成nil,person仍然不会被销毁
[muArray addObject:person];
//当一个对象从集合中删除的时候,会释放掉这个强指针
//[muArray removeObject:person];
//[muArray removeAllObjects];
muArray = nil;//当运行到这一行,系统会判断还有强指针指向它吗?一看没有,马上把这个对象给释放了,注意是把不保持里面对象是强指针了,那么你再把对象设为nil,对象就会被销毁
// NSLog(@"retaincount %zi",person.retainCount);
person = nil;
NSLog(@"aaaaaaaaaaaaaaa");
}
return 0;
}

三:集合之间的相互转换                                                                                                                             

1:不可变集合转变成可变集合
2:NSArray转换成NSSet
3:  字符串串转换成数组(重点,相当于java中的split);

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
@autoreleasepool {
//1:NSArray 转换成NSMutableArray
NSArray *array = @[@"one",@"two",@"three"];
NSMutableArray *muArray = [NSMutableArray arrayWithArray:array];
NSLog(@"muArray %@",muArray);

//2: NSDictionary 转换成NSMutableDictionary
NSDictionary *dict = @{
@"1":@"one",
@"2":@"two",
@"3":@"three"
};
NSMutableDictionary *muDict = [NSMutableDictionary dictionaryWithDictionary:dict];
NSLog(@"muDict = %@",muDict);

//3:NSSet 转换成NSMutableSet
NSSet *set = [[NSSet alloc]initWithObjects:@"one",@"two",@"three", nil];
NSMutableSet *muSet = [NSMutableSet setWithSet:set];
NSLog(@"muset%@",set);

//4:NSArray 转换成NSSet
NSMutableSet *muSet2 = [NSMutableSet setWithArray:array];
NSLog(@"muset2 %@",muSet2);

//5:NSDictionary 转换成 Array 注意:NSDictionary是键值对
NSArray *allkeys = [dict allKeys];
NSLog(@"allkeys %@",allkeys);
NSArray *allValues = [dict allValues];
NSLog(@"allValues 为:%@",allValues);

//重点!!!!!!!!!!
//6:字符串转换成数组 (相当于java中的split);
//想不起来名字了你可以这么干
//①:你首先要知道你要返回什么类型,本例中肯定是NSArray
//②:command +NSString 进入API中
//③:command +f 输入NSArray 你就会找到这个方法了

NSString *str = @"www.baidu.com";
NSArray *arraya = [str componentsSeparatedByString:@"."];
NSLog(@"%@",arraya);

}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息