|
iOS开发1.目录1.个人学习建议2.知识点整理3.下集预告iOS这一行,都过了这么多年,还是水分很足,没有几个愿意安安心心查资料写东西的。虽说博客都是互相抄,但是起码其他行业抄的最开始的人是对的,但是这一行因为中文资...
iOS开发1.目录 iOS这一行,都过了这么多年,还是水分很足,没有几个愿意安安心心查资料写东西的。虽说博客都是互相抄,但是起码其他行业抄的最开始的人是对的,但是这一行因为中文资料少(是的,到现在中文资料也不完善),所以出现很多粗制滥造的,这里经过笔者校验之后分享一些相关知识。 个人建议: 入门视频首选是斯坦福的CS193P教程 - Youtube,白胡子老爷爷在这一行可以称得上是元老,之前还想出一个针对这个视频教程的学习笔记,后来给鸽了;这里链接放了YouTube上的最新视频,墙内的朋友也可以自行百度其他资源,我这里也存了一份百度云,需要的可以私信。 入门教材Programming in Objective-C 6th edition(英文版),这里附上教材PDF下载链接,没有具体考证链接合法性,经济允许建议支持正版。 项目实战,去实验室找一个项目做一做,大概几个月也就熟了(最初级的那种),这里还要感谢当初带我的学长@子豪学长——是一个很让人佩服的学长。
下面是学习OC时对于一些知识点的总结,资料来源互联网,权当学习笔记,参考的资料尽量附有原文链接。 2.重要知识点总结下面的每一个点都可以单独行文,这里摘录其中较为重要的部分,同时添加链接供读者深度查看。 2.1 继承OC中的继承属于单继承,这一点和Java类似。 - 在Objective-C中super是指向直接父类的指针
- 而self是指向本身的指针,self就相当于java中的this指针。
在Objectiv-C中几乎所有的类都是继承自NSObject类,NSObject类中存在大量功能强大的方法。这里不再赘述,详情可查看 2.2 MVC【图mvc】iOS开发——MVC详解&Swift+OC 2.3 block这里还是搬运一下 block定义 struct Block_descriptor { unsigned long int reserved; unsigned long int size; void (*copy)(void *dst, void *src); void (*dispose)(void *); }; struct Block_layout { void *isa; int flags; int reserved; void (*invoke)(void *, ...); struct Block_descriptor *descriptor; /* Imported variables. */ };
有人认为OC中block 本质应该是一个函数指针加上一个对应捕获上下文变量的内存块(结构体或者类),暂时没怎么用过,了解的也不是很透彻。建议参考:知乎:OC中, block(块)的本质是什么? 2.4 静态(static)、全局变量这里只需要看几篇博客,不再搬运。 1.OC中的全局变量 与 static2.OC中的static静态变量/extern全局变量/内存分区说明 2.5 Id, instancetype2.6 Copy, strong, retain先说copy和strong的区别,这里摘录一个例子。
在定义一个类的property时候,为property选择strong还是copy特别注意和研究明白的,如果property是NSString或者NSArray及其子类的时候,最好选择使用copy属性修饰。 为什么呢?这是为了防止赋值给它的是可变的数据,如果可变的数据发生了变化,那么该property也会发生变化。 代码示例 还是结合代码来说明这个情况 @interface Person : NSObject @property (strong, nonatomic) NSArray *bookArray1; @property (copy, nonatomic) NSArray *bookArray2; @end @implementation Person //省略setter方法 @end //Person调用 main(){ NSMutableArray *books = [@[@"book1"] mutableCopy]; Person *person = [[Person alloc] init]; person.bookArray1 = books; person.bookArray2 = books; [books addObject:@"book2"]; NSLog(@"bookArray1:%@",person.bookArray1); NSLog(@"bookArray2:%@",person.bookArray2); }
我们看到,使用strong修饰的person.bookArray1输出是[book1,book2],而使用copy修饰的person.bookArray2输出是[book1]。这下可以看出来区别了吧。 备注:使用strong,则person.bookArray1与可变数组books 指向同一块内存区域 ,books内容改变,导致person.bookArray1的内容改变,因为两者是同一个东西;而使用copy,person.bookArray2在赋值之前,将books内容复制,创建一个 新的内存区域,所以两者不是一回事,books的改变不会导致person.bookArray2的改变。
Objective-C属性修饰符strong和copy的区别 2.7 Manually reference Counting和Automatic Reference Counting 1.MRC 手动管理内存(Manual Reference Counting) int main(int argc, const char * argv[]) { @autoreleasepool { // 只要创建一个对象默认引用计数器的值就是1 Person *p = [[Person alloc] init]; NSLog(@"retainCount = %lu", [p retainCount]); // 1 // 只要给对象发送一个retain消息, 对象的引用计数器就会+1 [p retain]; NSLog(@"retainCount = %lu", [p retainCount]); // 2 // 通过指针变量p,给p指向的对象发送一条release消息 // 只要对象接收到release消息, 引用计数器就会-1 // 只要一个对象的引用计数器为0, 系统就会释放对象 [p release]; // 需要注意的是: release并不代表销毁回收对象, 仅仅是计数器-1 NSLog(@"retainCount = %lu", [p retainCount]); // 1 [p release]; // 0 NSLog(@"--------"); } // [p setAge:20]; // 此时对象已经被释放 return 0; }
2.自动释放池(Automatic Reference Counting)autorelease是一种支持引用计数的内存管理方式,只要给对象发送一条autorelease消息,会将对象放到一个自动释放池中,当自动释放池被销毁时,会对池子里面的所有对象做一次release操作 不用再关心对象释放的时间不用再关心什么时候调用release autorelease实际上只是把对release的调用延迟了,对于每一个autorelease,系统只是把该对象放入了当前的autorelease pool中,当该pool被释放时,该pool中的所有对象会被调用release。 (编辑:无忧刷机网 - 51刷机网)
【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!
|