OC之【NSDictionary详解】

main.m文件

#import <Foundation/Foundation.h>

#import "Student.h"

#pragma mark 字典的初始化

void dictCreate() {

// NSDictionary是不可变的

NSDictionary *dict = [NSDictionarydictionaryWithObject:@"v"forKey:@"k"];

//最常用的初始化方式

dict = [NSDictionarydictionaryWithObjectsAndKeys:

@"v1", @"k1",

@"v2", @"k2",

@"v3", @"k3",nil];

NSArray *objects = [NSArrayarrayWithObjects:@"v1",@"v2", @"v3",nil];

NSArray *keys = [NSArrayarrayWithObjects:@"k1",@"k2", @"k3",nil];

dict = [NSDictionarydictionaryWithObjects:objects forKeys:keys];

NSLog(@"%@", dict);

}

#pragma mark 字典的基本用法

void dictUse() {

NSDictionary *dict = [NSDictionarydictionaryWithObjectsAndKeys:

@"v1", @"k1",

@"v2", @"k2",

@"v3", @"k3",nil];

// count是计算有多少个键值对(key-value)

NSLog(@"count=%zi", dict.count);

//由于NSDictionary是不可变的,所以只能取值,而不能修改值

id obj = [dict objectForKey:@"k2"];

NSLog(@"obj=%@", obj);

//将字典写入文件中

NSString *path [email protected]"/Users/apple/Desktop/dictionary.xml";

[dict writeToFile:pathatomically:YES];

//从文件中读取内容

dict = [NSDictionarydictionaryWithContentsOfFile:path];

NSLog(@"dict=%@", dict);

}

#pragma mark 字典的用法

void dictUse2() {

NSDictionary *dict = [NSDictionarydictionaryWithObjectsAndKeys:

@"v1", @"k1",

@"v2", @"k2",

@"v3", @"k3",nil];

// 返回所有的key

NSArray *keys = [dict allKeys];

//NSLog(@"keys=%@", keys);

NSArray *objects = [dict allValues];

//NSLog(@"objects=%@", objects);

// 根据多个key取出对应的多个value

// 当key找不到对应的value时,用marker参数值代替

objects = [dict objectsForKeys:[NSArrayarrayWithObjects:@"k1",@"k2", @"k4", nil]notFoundMarker:@"not-found"];

NSLog(@"objects=%@", objects);

}

#pragma mark 遍历字典

void dictFor() {

NSDictionary *dict = [NSDictionarydictionaryWithObjectsAndKeys:

@"v1", @"k1",

@"v2", @"k2",

@"v3", @"k3",nil];

// 遍历字典的所有key

for (id keyin dict) {

id value = [dict objectForKey:key];

NSLog(@"%@=%@", key, value);

}

}

#pragma mark 遍历字典2

void dictFor2() {

NSDictionary *dict = [NSDictionarydictionaryWithObjectsAndKeys:

@"v1", @"k1",

@"v2", @"k2",

@"v3", @"k3",nil];

// key迭代器

NSEnumerator *enumer = [dict keyEnumerator];

id key = nil;

while ( key = [enumer nextObject]) {

id value = [dict objectForKey:key];

NSLog(@"%@=%@", key, value);

}

// 对象迭代器

// [dict objectEnumerator];

}

#pragma mark 遍历字典3

void dictFor3() {

NSDictionary *dict = [NSDictionarydictionaryWithObjectsAndKeys:

@"v1", @"k1",

@"v2", @"k2",

@"v3", @"k3",nil];

[dict enumerateKeysAndObjectsUsingBlock:

^(id key,id obj, BOOL *stop) {

NSLog(@"%@=%@", key, obj);

}];

}

#pragma mark

void dictMemory() {

Student *stu1 = [StudentstudentWithName:@"stu1"];

Student *stu2 = [StudentstudentWithName:@"stu2"];

Student *stu3 = [StudentstudentWithName:@"stu3"];

//一个对象称为字典的key或者value时,会做一次retain操作,也就是计数器会+1

NSDictionary *dict = [NSDictionarydictionaryWithObjectsAndKeys:

stu1,@"k1",

stu2,@"k2",

stu3,@"k3", nil];

//当字典被销毁时,里面的所有key和value都会做一次release操作,也就是计数器会-1

}

int main(int argc,const char * argv[])

{

@autoreleasepool {

dictMemory();

}

return 0;

}

Student.h文件

#import <Foundation/Foundation.h>

@interface Student :NSObject

@property (nonatomic,retain) NSString *name;

+ (id)studentWithName:(NSString *)name;

@end

Student.m文件

#import "Student.h"

@implementation Student

+ (id)studentWithName:(NSString *)name {

Student *stu = [[Studentalloc] init];

stu.name = name;

return [stu autorelease];

}

- (void)dealloc {

NSLog(@"%@被销毁了", _name);

// 释放name

[_namerelease];

[superdealloc];

}

@end

时间: 2024-08-25 18:13:02

OC之【NSDictionary详解】的相关文章

iOS开发——UI篇OC篇&amp;UIStackView详解

UIStackView详解 一.继承关系.遵守协议.隶属框架及可用平台 UIStackView 类提供了一个高效的接口用于平铺一行或一列的视图组合.Stack视图使你依靠自动布局的能力,创建用户接口使得可以动态的调整设备朝向.屏幕尺寸及任何可用范围内的变化.Stack视图管理着所有在它的 arrangedSubviews 属性中的视图的布局.这些视图根据它们在 arrangedSubviews 数组中的顺序沿着 Stack 视图的轴向排列.精确的布局变量根据 Stack 视图的 axis , d

iOS开发——实用技术OC篇&amp;事件处理详解

事件处理详解 一:事件处理 事件处理常见属性: 事件类型 @property(nonatomic,readonly) UIEventType     type; @property(nonatomic,readonly) UIEventSubtype  subtype; 事件产生的时间 @property(nonatomic,readonly) NSTimeInterval  timestamp; 事件传递 - hitTest:withEvent: SWIFT func hitTest(_ po

iOS开发——UI篇OC篇&amp;UICollectionView详解+实例

UICollectionView详解+实例 实现步骤: 一.新建两个类 1.继承自UIScrollView的子类,比如HMWaterflowView * 瀑布流显示控件,用来显示所有的瀑布流数据 2.继承自UIView的子类,比如HMWaterflowViewCell * 代表着瀑布流数据中的一个单元(一个格子) 3.总结 HMWaterflowView和HMWaterflowViewCell的关系实际上类似于 UITableView和UITableViewCell的关系 二.设计HMWater

iOS开发——多线程OC篇&amp;多线程详解

多线程详解 前面介绍了多线程的各种方式及其使用,这里补一点关于多线程的概念及相关技巧与使用,相信前面不懂的地方看了这里之后你就对多线程基本上没有什么问题了! 1——首先ios开发多线程中必须了解的概念: 进程 正在进行中的程序被称为进程,负责程序运行的内存分配 每一个进程都有自己独立的虚拟内存空间 线程 线程是进程中一个独立的执行路径(控制单元) 一个进程中至少包含一条线程,即主线程 可以将耗时的执行路径(如:网络请求)放在其他线程中执行 创建线程的目的就是为了开启一条新的执行路径,运行指定的代

iOS开发——UI篇OC篇&amp;SpriteKit详解

SpriteKit详解 SpriteKit,iOS/Mac游戏制作的新纪元 这是我的WWDC2013系列笔记中的一篇,完整的笔记列表请参看这篇总览.本文仅作为个人记录使用,也欢迎在许可协议范围内转载或使用,但是还烦请保留原文链接,谢谢您的理解合作.如果您觉得本站对您能有帮助,您可以使用RSS或邮件方式订阅本站,这样您将能在第一时间获取本站信息. 本文涉及到的WWDC2013 Session有 Session 502 Introduction to Sprite Kit Session 503 D

ios开发——实战OC篇&amp;FMDB详解

FMDB详解 前一篇文章中我们介绍的SQLite的使用,在iOS中原生的SQLite API在使用上相当不友好. 于是,就出现了一系列将SQLite API进行封装的库,例如FMDB.PlausibleDatabase.sqlitepersistentobjects等,FMDB (https://github.com/ccgus/fmdb) 是一款简洁.易用的封装库,这一篇文章简单介绍下FMDB的使用. 在FMDB下载文件后,工程中必须导入,并使用 libsqlite3.dylib 依赖包. F

OC教程07-字典NSDictionary详解

字典是我们常见的数据类型,在Java中对应的是HashMap * 字典:又称键值对,通过一个key可以访问他的值 * 分类:NSDictionary不可变字典,NSMutableDictionary可变字典 * 备注:字典的key一般是 字符串,如 @"key" * 备注:字典的值,必须是对象,不能是C语言的基本类型 * 备注:字典中的值也可以是字典,可以多级嵌套 * 备注:字典元素的访问,可以直接通过下标的形式访问 * 注意:字典中的键值对是无序的 //1.不可变字典的创建 NSDi

iOS开发-OC篇-KVC详解

说到KVC,不得不承认KVC在开发过程中是神器一般的存在.如果正确灵活使用kvc,会使得整个开发过程轻松很多. KVC的使用 1.KVC 全称 key valued coding 键值编码 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性.JAVA,C#都有这个机制.ObjC也有,所以你根部不必进行任何操作就可以进行属性的动态读写,就是KVC. KVC的操作方法由NSKeyValueCoding提供,而他是NSObjec

OC内存管理详解

前言 由于移动设备的内存有限,所以我们需要对内存进行严格的管理,以避免内存泄露造成资源浪费.在OC中,只有对象才属于内存管理范围,例如int.struce等基本数据类型不存在内存管理的概念.在iOS开发中,对内存的管理实际上就是对引用计数器的管理. OC内存管理的三种方式 自动垃圾收集(Automatic Garbage Collection): 手动引用计数器(Manual Reference Counting)和自动释放池: 自动引用计数器(Automatic Reference Count