【iOS开发干货】Objective-C基础知识点总结(一)

iOS开发

1.目录

  • 1.个人学习建议
  • 2.知识点整理
  • 3.下集预告

    iOS这一行,都过了这么多年,还是水分很足,没有几个愿意安安心心查资料写东西的。虽说博客都是互相抄,但是起码其他行业抄的最开始的人是对的,但是这一行因为中文资料少(是的,到现在中文资料也不完善),所以出现很多粗制滥造的,这里经过笔者校验之后分享一些相关知识。

个人建议:

  • 入门视频首选是斯坦福的CS193P教程 - Youtube,白胡子老爷爷在这一行可以称得上是元老,之前还想出一个针对这个视频教程的学习笔记,后来给鸽了;这里链接放了YouTube上的最新视频,墙内的朋友也可以自行百度其他资源,我这里也存了一份百度云,需要的可以在评论留下邮箱(某资源论坛既视感???)。

  • 入门教材Programming in Objective-C 6th edition(英文版),这里附上教材PDF下载链接,没有具体考证链接合法性,经济允许建议支持正版。

  • 项目实战,大学生的话去实验室找一个项目做一做,大概几个月也就熟了(最初级的那种),这里还要感谢当初带我的学长@子豪学长——是一个很让人佩服的学长。社会人士自学的话可以在在github、码云上面多找找完整的客户端试试看。

下面是学习OC时对于一些知识点的总结,资料来源互联网,权当学习笔记,参考的资料尽量附上原文链接。

2.重要知识点总结

其实下面的每一个点都可以单独行文,这里摘录其中较为重要的部分,同时添加链接供读者深度查看。之后可能单独领出深究,这里先埋坑。

2.1 继承关系

OC中的继承属于单继承,这一点和Java类似。
* 在Objective-C中super是指向直接父类的指针
* 而self是指向本身的指针,self就相当于java中的this指针。

在Objectiv-C中几乎所有的类都是继承自NSObject类,NSObject类中存在大量功能强大的方法。这里不再赘述,详情可查看
* Objective-C中的继承和多态

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中的全局变量 与 static
 2.OC中的static静态变量/extern全局变量/内存分区说明

2.5 Id, instancetype

待补充…

2.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操作

  • 使用autorelease有什么好处呢

不用再关心对象释放的时间
不用再关心什么时候调用release

  • autorelease的原理实质上是什么?

autorelease实际上只是把对release的调用延迟了,对于每一个autorelease,系统只是把该对象放入了当前的autorelease pool中,当该pool被释放时,该pool中的所有对象会被调用release。

OC知识–彻底理解内存管理(MRC、ARC)

2.8 auto、const和volatile

待补充…

2.9 alloc, init, dealloc, release,new ,retain

简单地说,alloc分配内存空间,init对该对象进行初始化,这些方法若没有重写方法则默认继承自父类。
通常来讲,new = alloc + init
Objective-C的对象在使用完成之后不会自动销毁,需要执行dealloc来释放空间(销毁),否则内存泄露。下面是一个简单的例子。

ClassA *obj1 = [[ClassA alloc] init];

[obj1 hello]; //输出hello

[obj1 dealloc];

Objective-C采用了引用计数(ref count或者retain count)。对象的内部保存一个数字,表示被引用的次数。例如,某个对象被两个指针所指向(引用)那么它的retain count为2。需要销毁对象的时候,不直接调用dealloc,而是调用release。release会让retain count减1,只有retain count等于0,系统才会调用dealloc真正销毁这个对象。

Objective-C指针赋值时,retain count不会自动增加,需要手动retain。


ClassA *obj1 = [[ClassA alloc] init]; //retain count = 1
ClassA *obj2 = obj1; //retain count = 1
[obj2 retain]; //retain count = 2
[obj1 hello]; //输出hello
[obj1 release]; //retain count = 2 – 1 = 1
[obj2 hello]; //输出hello
[obj2 release]; //retain count = 0,对象被销毁

alloc & init

Objective-C 内存管理——你需要知道的一切

Objective-C内存管理教程和原理剖析(一)

2.10 文件操作

待补充…

2.11 分类和协议

待补充…

2.12 NSString, NSNumber,NSArray,NSDictionary, NSSet 类的主要方法

待补充…

4.

欢迎指正批评与交流,本博客将长期更新维护,如果读完觉得有一定帮助可以点一个喜欢支持一下��

本文首发于简书: http://www.jianshu.com/p/13580d6d6d2a

未完待续…

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值