OC加强-day06

时间:2021-09-27 08:14:41

#program mark - 08 NSMutableDictionary的使用 [掌握]

"/08 NSMutableDictionary的使用/1_练习

"练习

1.小明的身高1米5,体重80KG,年龄10岁,创建可变字典存储这些信息

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

NSMutableDictionary *MxiaomingDict = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"1.5m",@"height",@"80KG",@"weight",@"10",@"age"

, nil];

NSLog(@"%@",MxiaomingDict);

return 0;

}

2.小明使用的手机是nokia5610,使用的手表是appleWatch,把两个键值对添加到字典

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

NSMutableDictionary *MxiaomingDict = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"1.5m",@"height",@"80KG",@"weight",@"10",@"age"

, nil];

[MxiaomingDict setObject:@"nokia5610" forKey:@"phone"];

[MxiaomingDict setObject:@"appleWatch" forKey:@"watch"];

NSLog(@"%@",MxiaomingDict);

return 0;

}

3.删除身高和手表的键值对

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

NSMutableDictionary *MxiaomingDict = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"1.5m",@"height",@"80KG",@"weight",@"10",@"age"

, nil];

[MxiaomingDict setObject:@"nokia5610" forKey:@"phone"];

[MxiaomingDict setObject:@"appleWatch" forKey:@"watch"];

NSLog(@"%@",MxiaomingDict);

[MxiaomingDict removeObjectsForKeys:@[@"height",@"watch"]];

NSLog(@"%@",MxiaomingDict);

return 0;

}

#program mark - 09 字典的持久化 [听懂]

写入到文件

#program mark - 10 集合的内存管理 [掌握]

"复习

1.MRC内存管理的原则

1>每一个OC对象都有一个属性叫引用计数器 retainCount

2>用alloc/new直接创建的 对象retainCount为1

3>只要有新的指针指向一个对象,就应该让对象的retainCount+1  --> [指针  retain];

4>指向对象的指针销毁之前应该让指向的对象的retainCount-1  --> [指针  release];

5>对象的引用计数器为0的时候,操作系统自动回收对象,并顺便调用dealloc.

2.ARC内存管理原则

1>强指针

__strong修饰的指针,一个指针前面什么都不写默认是强指针

2>弱指针

__weak修饰的指针

3>一个对象只要没有强指针指向,立刻就释放掉.

"集合的内存管理

1.什么是集合

OC中字典和数组统称集合

2.MRC

1>把对象放入集合中,对象的retainCount会自动+1

2>集合销毁的时后,对象的retainCount会自动-1

"随堂代码/10 集合的内存管理/1_MRC

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

MKPerson *xiaoyue = [MKPerson new];

NSLog(@"%lu",xiaoyue.retainCount);

//    NSArray *test = @[xiaoyue];

//    NSMutableArray *test = [NSMutableArray arrayWithObject:xiaoyue];

NSDictionary *test = @{@"per":xiaoyue};

NSLog(@"%lu",xiaoyue.retainCount);

[test release];

NSLog(@"%lu",xiaoyue.retainCount);

[xiaoyue release];

return 0;

}

2.ARC

1>ARC下,集合自身的内存管理很特殊,不遵守强指针弱指针原则

"随堂代码/10 集合的内存管理/2_ARC下集合创建自动autorelease

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

{

{

MKPerson *xiaoyue = [MKPerson new];

NSMutableArray *test = [NSMutableArray arrayWithObject:xiaoyue];

//发现出了作用域集合对象没有销毁,

//如果销毁了,那么xiaoyue指向的对象肯定没有强指针指向了,应该释放,现在没有释放,所以集合肯定没有销毁

}

return 0;

}

2>[记住]

ARC下苹果提供的创建集合的方式内部对集合做了autorelease,为了避免内存泄露,所以尽量把创建集合的代码放到自动释放池中

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

{

@autoreleasepool{

MKPerson *xiaoyue = [MKPerson new];

NSMutableArray *test = [NSMutableArray arrayWithObject:xiaoyue];

}//代码走到这一行,集合被销毁,集合中存储的xiaoyue指针也被销毁,所以人对象被释放了

return 0;

}

#program mark - 11 NSFileManager的常用方法之判断 [听懂]

NSFileManager: 用来操作磁盘上的文件 文件夹 对他们进行创建,删除,复制,移动...

这个类创建的对象是以单例模式创建的

#program mark - 12 NSFileManager的常用方法之获取信息 [听懂]

判断指定过得文件或文件夹在磁盘上是否真实存在

- (BOOL)fileExistsAtPath:(NSString *)path;

判断指定过得文件或文件夹在磁盘上是否可读

- (BOOL)isReadableFileAtPath:(NSString *)path;

判断指定过得文件或文件夹在磁盘上是否可写

- (BOOL)isWritableFileAtPath:(NSString *)path;

判断指定过得文件或文件夹在磁盘上是否可执行

- (BOOL)isExecutableFileAtPath:(NSString *)path;

判断指定过得文件或文件夹在磁盘上是否可删

- (BOOL)isDeletableFileAtPath:(NSString *)path;

#program mark - 13  NSFileManager的其他方法

#program mark - 14 文件终结者

#program mark - 15 结构体与类的区别

"引入

1.ios开发中每一个控件,都是View,

2.这个view一定有坐标,通过这个坐标可以确定控件在屏幕哪一个位置显示

3.坐标: 包含x轴坐标和y轴坐标

"问题

如何表示一个坐标?

1.结构体

struct Point {

float x;

float y;

};

2.类

@interface Point : NSObject

@property(nonatomic,assign)float x;

@property(nonatomic,assign)float y;

@end

@implementation Point

@end

"问题

到底应该结构体还是类?

1>结构体

只能有属性,不能有方法

结构体变量存储在栈区域-->访问速度稍微比堆区快

2>类

既能有属性又能有方法

实例化对象存储在堆区,速度比栈区稍慢

3>表示坐标

只需要一个x坐标和一个y坐标,不需要方法-->结构体

"结论

1>如果表示的数据类型既有属性又有行为就只能用类

2>如果这个类型属性比较少,又没有行为,就使用结构体

3>一句话,轻量级用结构体 重量级用类

#program mark - 16 CGPoint [掌握]

此知识点的复习见OC加强05视频笔记/16 CGPoint.pdf

"练习

1.创建一个类叫做YYView表示一个视图

2.添加一个结构体属性叫做orign,这个结构体包含x坐标和y坐标

3.创建一个view对象叫做testView,给origin属性赋值为(100,100)

4.打印这个testView的坐标

#program mark - 17 CGSize [掌握]

此知识点的复习见OC加强05视频笔记/17 CGSizet.pdf

"练习

1.在上面练习的基础上给YYView类添加一个属性结构体属性叫做size,这个结构体内包含float类型的高度height和宽度width

2.给testYiew的这个size属性赋值为(100,200)

3.打印testYiew的长度和宽度

#program mark - 18 CGRect

"练习

1.把上面练习的YYView类的orign属性和size属性封装成一个叫做frame的结构体属性

2.修改代码,使得程序能正常运行

#program mark - 19 案例讲解 [了解]

1.ios开发中有一个类ViewController类表示ios应用的一个界面,程序一起动会调用这个对象的viewdidload方法

2.ios开发中有一个类UIKit框架中有一个类叫做UIView,表示一个视图

3.UIView有一个属性叫做frame,是一个CGRect类型的结构体,表示视图的坐标和尺寸

4.UIView有一个属性叫做backgroundColor可以通过赋值符号用[UIColor redColor]设置为红色

5.UIView有一个对象方法叫做addSubView:可以添加一个视图到自己内部

6.ViewController中有一个和屏幕尺寸一样大的UIView类型的属性叫做view

按照上面提示在ios应用下完成需求

1.创建一个UIView对象,坐标是(50,60),尺寸是(100,200),颜色是绿色

2.在模拟器上显示这个对象

#program mark - 20 NSNumber [掌握]

"练习

"随堂代码/20 NSNumber/1_练习

用快速转换的方式把下面常量或者变量添加到不可变数组中存储起来:

int num = 10;

10

11.1f

12.2

'a'

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

int num = 10;

NSArray *arr = @[@(num),@10,@11.1f,@12.2,@'a'];

NSLog(@"%@",arr);

return 0;

}

#program mark - 21NSValue

#program mark - 22 NSDate的基本使用

#program mark - 23 得到日期对象的各个部分

#program mark - 24 字符串的拷贝[重点掌握]

1.字符串深拷贝和浅拷贝的概念

1>浅拷贝

1)OC中的字符串是在堆区或常量区存储的对象

2)这个对象由一个栈区的指针指向

3)把这个字符串对象的指针复制一份,此时有两个指针指向这一个字符串对象,这个过程叫做浅拷贝

2>深拷贝

1)OC中的字符串是在堆区或常量区存储的对象

2)这个对象由一个栈区的指针指向

3)把这个字符串对象本身复制一份,此时如果有一个指针接受新创建出来的对象的地址,

有两个指针分别指向内容相同但是地址不同的两个字符串对象,这个过程叫做深拷贝

2.copy方法和mutablecopy方法

1>格式

- (id)copy;

- (id)mutableCopy;

2>来源

是NSObject中的方法,任何NSObject子类都拥有者两个方法.

3>有什么用

"copy和mutableCopy两个方法和可变对象或不可变对象结合在一起使用,可以实现深拷贝或浅拷贝

新对象  = [可变对象/不可变对象  copy/mutableCopy]

不可变对象 --- copy --- 浅拷贝

不可变对象 --- mutablecopy --- 深拷贝 -- 结果是可变的

可变对象  --- copy  -- 深拷贝 --- 结果是不可变的

可变对象  --- mutableCopy -- 深拷贝 ---可变的

验证:

可变对象  --- copy  -- 深拷贝 --- 结果是不可变的

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

NSMutableString *Mstr = [NSMutableString stringWithFormat:@"无色大师"];

NSString *MstrCopy = [Mstr copy];

NSLog(@"%p------%p",Mstr,MstrCopy);//不一样说明是深拷贝

NSLog(@"%@------%@",Mstr,MstrCopy);//肯定是一样的

return 0;

}

//下面代码验证结果是不可变对象

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

NSMutableString *Mstr = [NSMutableString stringWithFormat:@"无色大师"];

NSMutableString *MstrCopy = [Mstr copy];

NSLog(@"%p------%p",Mstr,MstrCopy);

NSLog(@"%@------%@",Mstr,MstrCopy);

[MstrCopy appendString:@"123"];//运行崩溃

return 0;

}

#program mark - 25 @property参数copy [重点掌握]

"需求

1.在IOS开发过程中,tableView是一种常用的表格视图.其中每一行叫做一个cell

2.定义一个cell类,这个cell类有一个NSString类型的标题属性.

3.在main.m中模拟请求网络数据3次网络数据,每次请求结束会获得一个字符串标题,此时就创建一个cell对象并将标题赋值给这个cell对象的标题属性,要求每次解析都用同一个可变字符串接收标题.

用NSLog模拟网络请求数据.

"随堂代码/25 @property参数copy/1_copy参数

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

//1.定义一个可变字符串存储请求到标题的字符串

NSMutableString *titleStr = [NSMutableString string];

//2.第一次网络请求

NSLog(@"请求第一个标题---北京某男子地铁中跳舞");

//获取标题

[titleStr setString:@"北京某男子地铁中跳舞"];

//创建cell对象

MKCell *cell1 = [[MKCell alloc] init];

//给cell对象设置标题

cell1.title = titleStr;

NSLog(@"%@",cell1.title);

//3.第二次网络请求

NSLog(@"请求第一个标题---北京某男子地铁中洗头");

[titleStr setString:@"北京某男子地铁中洗头"];

MKCell *cell2 = [[MKCell alloc] init];

cell2.title = titleStr;

NSLog(@"%@",cell2.title);

//4.第三次网络请求

NSLog(@"请求第一个标题---北京某男子地铁中玩手机");

[titleStr setString:@"北京某男子地铁中玩手机"];

MKCell *cell3 = [[MKCell alloc] init];

cell3.title = titleStr;

NSLog(@"%@",cell3.title);

//问题

//NSLog(@"----%@",cell1.title);

return 0;

}

"解决

把cell类中属性strong改为copy

原理

可变对象----copy---深拷贝----结果是不可变对象

"结论

对象的NSString/NSMutableString属性,统一用copy修饰.

@property(nonatomic,copy)NSString * title;

#program mark - 26 单例设计模式 [重点掌握]

1.单例设计模式

单例:单个对象

1个类的对象无论在合适创建,无论创建多少次,创建出来的对象都是同一个对象

2.

1>.创建对象的方法

+alloc方法 这个方法在内存中申请空间创建对象

这个方法只是调用了另一个 +allocWithZone;

重写此方法

+(instancetype)allocWithZone:(struct _NSZone *)zone{

static id instance = nil;

if (instance == nil) {

instance = [super allocWithZone:zone];

}

return instance;

}

OC加强-day06的更多相关文章

  1. OC基础-day06

    #pragma mark - Day06_01_点语法 1. 点语法. 1). 如果要访问对象的属性,还要去调用属性对应的setter getter方法.好烦躁好烦躁. 2). 点语法的作用: 快速调 ...

  2. iOS代码规范(OC和Swift)

    下面说下iOS的代码规范问题,如果大家觉得还不错,可以直接用到项目中,有不同意见 可以在下面讨论下. 相信很多人工作中最烦的就是代码不规范,命名不规范,曾经见过一个VC里有3个按钮被命名为button ...

  3. 用C语言封装OC对象(耐心阅读,非常重要)

    用C语言封装OC对象(耐心阅读,非常重要) 本文的主要内容来自这里 前言 做iOS开发的朋友,对OC肯定非常了解,那么大家有没有想过OC中NSInteger,NSObject,NSString这些对象 ...

  4. 嵌入式&iOS:回调函数(C)与block(OC)传 参/函数 对比

    C的回调函数: callBack.h 1).声明一个doSomeThingCount函数,参数为一个(无返回值,1个int参数的)函数. void DSTCount(void(*CallBack)(i ...

  5. 嵌入式&iOS:回调函数(C)与block(OC)回调对比

    学了OC的block,再写C的回调函数有点别扭,对比下区别,回忆记录下. C的回调函数: callBack.h 1).定义一个回调函数的参数数量.类型. typedef void (*CallBack ...

  6. WebViewJavascriptBridge源码探究--看OC和JS交互过程

    今天把实现OC代码和JS代码交互的第三方库WebViewJavascriptBridge源码看了下,oc调用js方法我们是知道的,系统提供了stringByEvaluatingJavaScriptFr ...

  7. OC泛型

    OC泛型 泛型是程序设计语言的一种特性,他主要是为了限制类型的,比如OC中的数组,你可以限制他里面装的是NSString类型,泛型的话JAVA和C++都有的,大家要是对泛型不了解的话可以去百度一下. ...

  8. iOS学习15之OC集合

    1.数组类 1> 回顾C语言数组 数组是一个有序的集合, 来存储相同数据类型的元素. 通过下标访问数组中的元素,下标从 0 开始. 2> 数组 数组是一个有序的集合,OC中的数组只能存储对 ...

  9. JS 与OC 交互篇

    完美记录交互 CSDN博客: (OC调用JS) http://blog.csdn.net/lwjok2007/article/details/47058101 (JS调用OC) http://blog ...

随机推荐

  1. Java volatile的用法---转载

    我们知道,在Java中设置变量值的操作,除了long和double类型的变量外都是原子操作,也就是说,对于变量值的简单读写操作没有必要进行同步. 这在JVM 1.2之前,Java的内存模型实现总是从主 ...

  2. xml的解析与创建——bing到youdao导入文件的转换

    首先是为了解决一个问题:如何将必应单词本中记录的单词转入到有道词典中去.实际上,必应词典可以导出xml文件,但是该文件有道词典无法解析.这里涉及到xml的解析和创建了. 代码如下: import ja ...

  3. Session Store

    Session Store Configuration Session Usage Flash Data Session Drivers Configuration Since HTTP driven ...

  4. CC/G++ 学习笔记

    CC/G++ 学习笔记 本文是<An introduction to GCC>的学习笔记,记录使用GCC/G++主要的实用技巧,本文讲述的知识基本上摘自本书,附带自己的一些体验.如果想详细 ...

  5. Java通过JNI调用dll详细过程(转)

    源:Java通过JNI调用dll详细过程 最近项目有这样一个需求,在已有的CS软件中添加一个链接,将当前登录用户的用户名加密后放在url地址中,在BS的login方法里通过解密判断,如果为合法用户则无 ...

  6. JS组件系列——再推荐一款好用的bootstrap-select组件,亲测还不错

    前言:之前分享过两篇bootstrap下拉框的组件:JS组件系列——两种bootstrap multiselect组件大比拼  和 JS组件系列——Bootstrap Select2组件使用小结 ,收 ...

  7. 我推荐的 Java Web 学习路线

    晚上再 V2 的 Java 的节点看到有人问 Java Web 书籍推荐.我这半年多的时间,也从别的方向开始转向 Java 服务端开发,所以,我来说下我的学习路线,帮助有需要的朋友把半只脚踏进 Spr ...

  8. pycharm 倒入request包方法(新手)

    1.先安装request模块,在pycharm import,但是怎么也倒不进去,咨询了开发,原来需要把包倒入到pycharm 编译器里面才可以import 成功,具体操作步骤如下 首先确认下自己电脑 ...

  9. 《Linux内核分析》第八周学习笔记

    <Linux内核分析>第八周学习笔记 进程的切换和系统的一般执行过程 郭垚 原创作品转载请注明出处 <Linux内核分析>MOOC课程http://mooc.study.163 ...

  10. QT QProgressBar QProgressDialog 模态,位置设置,无边框,进度条样式

    一  关于模态设置 QProgressDialog可以设置模态(需要在new的时候传入parent),QProgressBar设置不好: 只有dialog可以设置模态,widget不能设置模态(QPr ...