ios 语法

2018-05-15  本文已影响80人  SnailLi

1、与alloc相对应的方法是:dealloc
2、与retain相对应的方法是:release/outrelease
1、2题解释:
在iOS中,alloc 代表着为对象在内存中开辟一个快空间,其经常要配合init使用,而dealloc则是当对象的引用计数为0的时候,将对象销毁,释放空间。而retain方法则是对象创建之后使对象的引用计数器加1,而release则是使对象的引用计数器减1。因此与alloc语义相反的方法是dealloc,与retain语义相反的是release,与alloc配对的方法是release,因为对象创建以后对象的引用计数器自动加1,而调用了release方法以后,对象的引用计数器为0,系统会自动调用dealloc方法释放掉该对象的空间。

3、@property的作用和特性:
@property = ivar(实例变量)+getter + setter(存取方法)
“属性” (property)作为 Objective-C 的一项特性,主要的作用就在于封装对象中的数据。 Objective-C 对象通常会把其所需要的数据保存为各种实例变量。实例变量一般通过“存取方法”(access method)来访问。其中,“获取方法” (getter)用于读取变量值,而“设置方法” (setter)用于写入变量值。这个概念已经定型,并且经由“属性”这一特性而成为 Objective-C 2.0 的一部分。 而在正规的 Objective-C 编码风格中,存取方法有着严格的命名规范。 正因为有了这种严格的命名规范,所以 Objective-C 这门语言才能根据名称自动创建出存取方法。
也可以说:@property = getter + setter;
属性(property)关键词能够传递出相关行为的额外信息。属性提供了一些可能会使用的特性来进行声明,包括assign(vscopy),weak,strong,atomic(vsnonatomic),readwrite,readonly等。

4、@synthesze的作用
1.@synthesize 的作用:是为属性添加一个实例变量名,或者说别名。同时会为该属性生成 setter/getter 方法。
2.禁止@synthesize:如果某属性已经在某处实现了自己的 setter/getter ,可以使用 @dynamic 来阻止 @synthesize 自动生成新的 setter/getter 覆盖。
3.内存管理:@synthesize 和 ARC 无关。
4.使用:一般情况下无需对属性添加 @synthesize ,但一些特殊情形仍然需要,例如protocol中声明的属性。

5、一个对象的dealloc方法在什么时候被调用
1、这个类被release的时候会被调用;
2、这个对象的retain count为0的时候会被调用;

6、分类(categories)能够向一个已有的类中添加方法

6、拓展(extensions)能够当前的类中曾加方法、属性

6、协议(protocal)分为两种,其中以@optional关键字声明的协议可以不被实现
协议中有两种情况,一种是必须要实现的required,一种是可选择实现optional。

7、NSObject是大多数Objective-C类继承的根类,他没有父类

8、autorelease的作用是:将对象放入自动释放池、延后调用releaase
1.作用
1.1 给对象发送一条autorelease消息, 会将对象放到一个自动释放池中
1.2 当自动释放池被销毁时,会对池子里面的所有对象做一次release操作
1.3 会返回对象本身
1.4 调用完autorelease方法后,对象的计数器不变
2.好处
2.1 不用再关心对象释放的时间,有利于规避坏内存访问的出现
2.2 不用再关心什么时候调用release

  1. 使用注意
    3.1 占用内存较大的对象不要随便使用autorelease
    3.1 占用内存较小的对象使用autorelease,没有太大影响
    4.autoreleasepool
    autoreleasepool是以栈结构存储的,先进后出,只有栈顶的Pool才处于活动状态,才可以装对象.并且因为是栈结构,所以销毁,是先销毁栈顶的pool,最后是栈底.

9、-(void)setName:(NSString *)newName{
selt.name = newName;
}
调用的结果:程序死循环

10、在KVC中通用的属性访问器方法是:valueForKey: 和setValue:forKey:

11、关键字nil在Objective-C中表示:一个空对象

12、#import和#include的区别:#import可以避免文件被多次引用

  1. 一般来说,导入objective c的头文件时用#import,包含c/c++头文件时用#include。
  2. import 确定一个文件只能被导入一次,这使你在递归包含中不会出现问题。

所以,#import比起#include的好处就是不会引起交叉编译。

13、在Objective-C中是否支持运算符重载:不支持重载

14、在Objective-C中能否在头文件里申明私有方法?不可以在头文件里声明私有方法。

15、在Objective-C中类的成员变量默认被申明为:@protected

16、在对象的dealloc方法中,[super dealloc];应该放在dealloc方法的最后一行

17、下面方法:[[[object method1] method2] method3:[object method4]];中的method的调用顺序是:1、2、4、3

18、ARC(Automatic Reference Counting)模式下,copy方法为被禁用,retain、release、autorelease方法被禁用

19、NSXMLParser对象不能调用initWithContentsOfFile方法进行构造

20、alloc、retain、copy关键字会引起对象的引用计数加一

21、在以.mm为口站名的文件里,可以包含:C、Objective-C、C++

22、FileManager、NotificationCenter、Application、Device类使用了单例(Singletion)模式

23、NSString、NSArray数据类型能直接放进NSArray数组中

24、Objestive-C的快速枚举对比循环访问的优点:
快速枚举可以直接使用NSEnumerator,使得枚举非常高效
快速枚举语法简洁
快速枚举安全,枚举器自带安全机制,如果在枚举过程中试图修改采集器会抛出异常

25、OC中包含一个自定义的头文件应该使用:#import ""

26、OC语言中类的实例变量如果只能被本类和其子类访问,需要@protected修饰符

27、@property与@synthesize配合使用

28、在Objective-C中,所有类的根类:NSObject

29、在NSMutableDictionary * people= [NSMutableDictionary dictionaryWithObjectsAndKeys:@"张三",@"左护法"];法中,能准确删除“张三”的代码是:[people removeObjectForKey:@"左护法"];
dictionaryWithObjectsAndKeys:方法的功能是创建字典,此字典具有多个值和多个键。与dictionaryWithObjects:唯一不同的是,这多个值和键没用放在数组中,而是直接进行了使用。
我们查看了他的语法:+ (instancetype)dictionaryWithObjectsAndKeys:(id)firstObject, ... NS_REQUIRES_NIL_TERMINATION NS_SWIFT_UNAVAILABLE("Use dictionary literals instead");
其中,(id)firstObject用来指定值和键,首位为值,第二位为键,第三位又为值,以此类推。
值得注意的是:dictionaryWithObjectsAndKeys方法在遇到nil对象时,会以为是最终的结束标志。于是在初始化NSMutableDictionary的时候遇到有nil对象就会结束初始化了,而且不管编译和运行中都不会报错,这样的bug显然很隐蔽。
例如:
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:value1, @"key1", value2, @"key2", value3, @"key3", nil];
可能会发现 dict 中没有3个key-value对,原因是 dictionaryWithObjectsAndKeys 遇到 object 为 nil 时结束。
解决方式是在 object 可能为 nil 下, 使用 setObject:forKey:
1NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:10];
[dict setObject:value1 forKey:@"key1"];
[dict setObject:value2 forKey:@"key2"];
[dict setObject:value3 forKey:@"key3"];

30、OC中的委托最好声明成:@assign

31、在OC中累的接口声明关键字为:@interface

32、Objective-C声明一个类要用到的编译指令是:@interface SomeClass

33、isKindOfClass:Class、isMemberOfClass:Class、respondToSelector:selector、conformsToProtocol:protocol方法属于NSObject的内省(Introspection)方法

34、使用protoco时,声明一组可选择实现与否的函数,需要在声明的前一行加上:@optional

35、if([str1 isEqualToString:str2])xxx可以比较两个NSString * str1,str2的异同。

36、Objective-C没有私有方法,有私有变量吗

37、一个类的delegate(代理)的作用:
一 传值:
传值经常用在b类要把自己的一个数据或者对象传给a类,让a类去展示或者处理。(切分紧耦合,和代码分块的时候经常用)
二 传递事件:
所谓传事件就是a类发生了什么事,把这件事告诉关注自己的人,也就是委托的对象,由委托的对象去考虑发生这个事件后应该做出什么反映。(这个经常见,例如在异步请求中,界面事件触发数据层改变等等)
三 利用委托赋值:
这种方法感觉是为了不暴露自己的属性就可以给自己复值,而且这样更方便了类的管理,只有在你想要让别人给你赋值的时候才调用,这样的赋值更可控一些。(例如tableView中的委托(dateSource)中常见)。

38、iOS开发之详解@property属性(copy,strong,weak,nonatomic,readwrite等)
@property一般可存放三种类型的属性,一般我们可以选择其中的一种或者即为@property(A,B,C)
a.第一种表示的是可读性
readonly:表示该变量只是可读,但是不能修改。
readwrite:表示变量的值既可读也可以修改。
b.第二种表示原子性
natomic:默认属性,在多线程情况下会生成一些互斥加锁代码,避免变量的读写不同步的问题。
nonatomic:非原子性访问,不加同步,多线程并发访问会提高性能。
c.第三种表示内存管理
assign:setter 方法直接赋值,引用计数器不会增加,为了解决原类型与环循引用问题,一般用于简单的数据类型int,float等就用它。
retain:使用reatin的话,赋值的时候引用计数器会+1,防止被内存释放掉。拷贝类型属于指针拷贝。
copy:使用copy的话,赋值的时候引用计数器会+1,防止被内存释放掉。拷贝类型属于内容拷贝。
strong:强引用,其存亡直接决定了所指对象的存亡。如果不存在指向一个对象的引用,并且此对象不再显示列表中,则此对象会被从内存中释放。简单讲strong等同于retain。
weak:弱引用,不决定对象的存亡。即使一个对象被持有无数个若引用,只要没有强引用指向他,那麽其还是会被清除。简单讲weak比assign多一个功能,就是当对象消失之后会自动把指针变为nil。

39、对于语句NSString * object= [[NSData alloc] init]; obj在编译时是NSString的类型;运行时是NSData类型对象

40、类别的作用
优点:
不需要通过增加子类而增加现有类的行为(方法),且类目中的方法与原始类方法基本没有区别;
通过类目可以将庞大一个类的方法进行划分,从而便于代码的日后的维护、更新以及提高代码的阅读性;
缺点:
无法向类目添加实例变量,如果需要添加实例变量,只能通过定义子类的方式;
类目中的方法与原始类以及父类方法相比具有更高优先级,如果覆盖父类的方法,可能导致super消息的断裂。因此,最好不要覆盖原始类中的方法。
类别的作用
给系统原有类添加方法,不能扩展属性。
如果类别中方法的名字跟系统的方法名一样,在调用的时候类别中的方法优先级更高;
分散类的实现:如:

41、Block不允许修改外部变量的值

42、Swift4.0支持print、debugPrint、dump函数输出

43、Swift的continue语句、break语句、fallthrough语句的作用:

continue的作用:语句的作用 通常在循环语句与条件语句一起使用。 在循环中碰到continue后,就会终止本次循环,不执行该循环中位于continue后面的任何语句。 continue语句用于结束当次循环,进入下一个循环。 for(var i=1;i<=10;i++) { if(i==6) continue; document.write(i); } //输出结果:1234578910 continue语句只能用在while语句、do/while语句、for语句、或者for/in语句的循环体内,在其它地方使用都会引起错误!

break语句的作用:是能够立即终止整个控制流。可以根据你想要的在switch或循环语句里的任何地方终止整个执行。当在循环体中使用break,循环会立即停止,并将控制流带到循环体括号())后方的第一行代码里。循环体里其他的代码不会被执行,也不会开始下一次迭代

fallthrough语句的作用:让 case 之后的语句会按顺序继续运行,且不论条件是否满足都会执行。

44、Swift语言中的数组正确的描述:

组成数组的各个变量成为数组的分量,也称为数组的元素,有时也被称为下标变量

数组中元素的访问,是通过下标语法来实现的

可以使用数组的append()方法或者直接使用+往已有的数组中添加新的元素

45、Swift语言中的字典正确的描述:

字典是一个能够使用类似于键的唯一标识来获取值的非序列化集合

和数组不同的是,字典中的元素并没有具体的顺序,也就是说字典是无序存放元素的

字典可以存储的键和值,必须提前定义他们的类型

46、关于Swift语言的函数,正确的描述:

如果不确定参数的数量,可以通过在变量类型的后面加...,定义可变参数

一个函数最多能游一个可变参数,且必须是函数表中最后一个

47、关于Swift语言的内置函数,正确的描述:

abs绝对值函数,用来返回指定蚕食的正值,当参数为负数时,返回对应的正数;当参数为正数时,结果不变。

min最小值函数,用来返回不定数量的参数之间的最小值

max最大值函数,用来返回不定数量的参数之间的最大值

map函数通常用于将数组中的每个元素,通过指定的方法进行转换

48、关于Swift语言的枚举类型,正确的描述:

所谓枚举是将变量的值一一列举出来,并只限于列举出来的值的范围内进行取值

Swift语言不许给枚举中的每一个成员都提供值

和Objective-C语言中的枚举不同,你可以为Swift的枚举添加方法

49、关于Swift语言的结构体类型,正确的描述:

可以为结构体定义常量或者变量的属性

和Objective-C语言中的结构体不同,可以为Swift的结构体添加方法

可以给结构体定一下标

使用struct关键字声明

50、关于Swift语言的类和结构体,正确的描述:

两者都可以定义属性以存值

两者都可以定义方法以提供功能

两者都可以定义下标脚本,用于允许使用下标语法访问值

两者都可以定义初始化器用于初始化状态

两者都可以被扩展

两者都可以遵循协议,已针对特定的类型提供标准功能

51、在为结构体和枚举定义静态方法时,可以使用static关键字

52、在为类定义静态方法时,可以使用class关键字

53、在Swift中类不同于结构体和枚举的是,类可以继承,结构体和枚举类型不可以

54、Swift中的Any 与 AnyObject、AnyClass的区别?

在 Swift 中能够表示 “任意” 这个概念的除了Any 、AnyObject以外,还有一个AnyClass。

Any、AnyObject、AnyClass有什么区别:

Any是一个空协议集合的别名,它表示没有实现任何协议,因此它可以是任何类型,包括类实例与结构体实例。

AnyObject是一个成员为空的协议,任何对象都实现了这个协议。

AnyClass是AnyObject.Type的别名而已。

1.AnyObject

本身就是一个接口,而且所有的class都隐式的实现了这个接口,这也限制了AnyObject是只适用于Class类型的原因。

AnyObject有什么用呢?

有过Objective-C开发经验的人肯定知道id, 它可以表示任意类的实例, 编译器不会对向声明为 id 的变量进行类型检查.而 Swift为了与 Cocoa 架构进行协作开发,就将原来的id用 AnyObject 来进行替代。

2.Any

既然AnyObject是只适用于Class类型 ,那swift中的所有基本类型怎么办,这个时候呢Any就帮上忙了

Any不仅仅能够容括class类型 ,说得更直白一点, 就是所有的类型都可以用Any表示, 包括基本数据类型, enum, struct, func(方法)等等.

3.AnyClass:

属于AnyObject.Type的别名:typealias AnyClass = AnyObject .Type

表示任意类的元类型,任意类的类型都隐式遵守这个协议.

55、Swift中的扩展功能(Extnsion),可以在没有获取原始代码的情况下扩展某个类型的功能

56、现有的类、结构或枚举类型的方法,都可以在扩展的帮助下进行添加

57、在Swift语言中,类型的功能可以使用扩展加入,但重写的功能不能使用扩展

58、在Swift语言中,使用扩展可以完成:

添加计算性属性和计算静态属性

定义实例方法和类型方法

提供新的构造器

使一个已有类型符合某个接口

59、关于Swift语言中的可选Optional类型,正确的描述

Optional类型是一个enum枚举类型,包含None和Some两个元素

再通过Some(T)包装wrap原始值之后,在使用Optional的时候,就要进行相应的拆包操作

60、在Swift中,我们可以给类、结构体和枚举定义subscript下标脚本的语法

61、关于Swift语言的下标,正确说法

下标脚本使用subscript关键字来定义

下标脚本使用get、set来定义读、写属性,逼不需要get和set都有,可以只读,并且读必须有

定义set属性时,传入的参数默认名为newValue。并且newValue的类型和subscript函数返回值相同

下标脚本允许你通过在视力后面的方括号中传入一个或者多个的索引值来实例进行访问和赋值

62、Objective-C中的头文件和实现文件,.h文件类似c++中的.h文件,.m文件类似.cpp文件

63、Objective-C语言可以和C、C++混合编程

64、Objective-C具有动态类型、动态绑定、动态加载

动态类型:所谓动态,就是指很多事情,编译时不做,运行时才去做。

动态绑定:基于动态类型,在某个实例对象被确定后,其类型便被确定了。该对象对应的属性和响应的消息也被完全确定,这就是动态绑定。动态绑定所做的,即是在实例所属类确定后,将某些属性和相应的方法绑定到实例上。这里所指的属性和方法当然包括了原来没有在类中实现的,而是在运行时才需要的新加入的实现

动态加载:根据需求加载所需要的资源

65、在Objective-C语言中 ,init方法创建的对象是并不会改变引用计数,alloc、new、copy方法创建的对象都是outorelease

66、Objective-C语言中,只有单一继承,没有多重继承

Object-c的类没有多继承,只支持单继承,如果要实现多继承的话,可以通过类别和协议的方式来实现,OC类似于多继承,是在 用protocol委托代理来实现的;可以实现多个接口,通过实现多个接口可以完成C++的多重继承;Category是类别,一般情况用分类好,用Category去重写类的方法,仅对本Category有效,不会影响到其他类与原有类的关系。

67、如果用Swuft写的class是继承自NSObject的话,Swift会自动为所有的非private的类和成员加上@objc

如果我们要使用 Objective-C 的代码或者特性来调用纯 Swift 的类型时候,我们会因为找不到所需要的这些运行时信息,而导致失败。解决起来也很简单,在 Swift 类型文件中,我们可以将需要暴露给 Objective-C 使用的任何地方 (包括类,属性和方法等) 的声明前面加上 @objc 修饰符。注意这个步骤只需要对那些不是继承自 NSObject 的类型进行,如果你用 Swift 写的 class 是继承自 NSObject 的话,Swift 会默认自动为所有的非 private 的类和成员加上 @objc。这就是说,对一个 NSObject 的子类,你只需要导入相应的头文件就可以在 Objective-C 里使用这个类了。

@objc 修饰符的另一个作用是为 Objective-C 侧重新声明方法或者变量的名字。

68、Objective-C有:for循环、NSEnumerator遍历、for....in循环、基于Block的遍历方式

69、无法向Category中添加实例变量

70、Objective-C的Category可以实现:

将类的实现分散到多个不同的文件或不同框架中

创建对私有方法的前向引用

向对象添加非正式协议

71、在Objective-C中当出现以下几点会产生异常

NSDictionary删除为nil的key

NSDictionary添加为nil的key

.h文件里的函数名,忘了修改.m文件里对应的函数名

使用第三方库时,没有添加“-ObjC”flag

NSDictionary插入nil对象

NSURL的初始化传入nil的http地址

数组最大下标处理错误、如果一个数组刚刚初始化,还是空的,就对他进行相关操作

72、Mach异常是指最底层的内核级异常,以下属于Mach的异常

EXC_BAD_ACCESS(Bad Memoy Access)

EXC_BAD_INSTRUCTION运行了非法的指令,往往是运行指令的参数不对(0或者nil的参数)

EXC_RESOURCE程序资源上线(cpu占用过高或者内存不足)

EXC_GUARD一些c函数访问错误导致的异常

73、最常见的Mach异常:EXC_BAD_ACCESS,一般由以下几个情况造成的:

访问非法地址(SIGBUS信号)

访问了被回收掉的内存(SIGSEGV信号)

74、Objective-C异常并不是真正的异常,但是当一个异常被抛出到最外层还没有被捕获,程序会强行发送SIGABRT信号来中断程序

  1. SIGHUP

本信号在用户终端连接(正常或非正常)结束时发出, 通常是在终端的控制进程结束时, 通知同一session内的各个作业, 这时它们与控制终端不再关联。

登录Linux时,系统会分配给登录用户一个终端(Session)。在这个终端运行的所有程序,包括前台进程组和后台进程组,一般都属于这个 Session。当用户退出Linux登录时,前台进程组和后台有对终端输出的进程将会收到SIGHUP信号。这个信号的默认操作为终止进程,因此前台进 程组和后台有终端输出的进程就会中止。不过可以捕获这个信号,比如wget能捕获SIGHUP信号,并忽略它,这样就算退出了Linux登录, wget也 能继续下载。

此外,对于与终端脱离关系的守护进程,这个信号用于通知它重新读取配置文件。

  1. SIGINT

程序终止(interrupt)信号, 在用户键入INTR字符(通常是Ctrl-C)时发出,用于通知前台进程组终止进程。

  1. SIGQUIT

和SIGINT类似, 但由QUIT字符(通常是Ctrl-)来控制. 进程在因收到SIGQUIT退出时会产生core文件, 在这个意义上类似于一个程序错误信号。

  1. SIGILL

执行了非法指令. 通常是因为可执行文件本身出现错误, 或者试图执行数据段. 堆栈溢出时也有可能产生这个信号。

  1. SIGTRAP

由断点指令或其它trap指令产生. 由debugger使用。

  1. SIGABRT

调用abort函数生成的信号。

  1. SIGBUS

非法地址, 包括内存地址对齐(alignment)出错。比如访问一个四个字长的整数, 但其地址不是4的倍数。它与SIGSEGV的区别在于后者是由于对合法存储地址的非法访问触发的(如访问不属于自己存储空间或只读存储空间)。

  1. SIGFPE

在发生致命的算术运算错误时发出. 不仅包括浮点运算错误, 还包括溢出及除数为0等其它所有的算术的错误。

  1. SIGKILL

用来立即结束程序的运行. 本信号不能被阻塞、处理和忽略。如果管理员发现某个进程终止不了,可尝试发送这个信号。

  1. SIGUSR1

留给用户使用

  1. SIGSEGV

试图访问未分配给自己的内存, 或试图往没有写权限的内存地址写数据.

  1. SIGUSR2

留给用户使用

  1. SIGPIPE

管道破裂。这个信号通常在进程间通信产生,比如采用FIFO(管道)通信的两个进程,读管道没打开或者意外终止就往管道写,写进程会收到SIGPIPE信号。此外用Socket通信的两个进程,写进程在写Socket的时候,读进程已经终止。

  1. SIGALRM

时钟定时信号, 计算的是实际的时间或时钟时间. alarm函数使用该信号.

  1. SIGTERM

程序结束(terminate)信号, 与SIGKILL不同的是该信号可以被阻塞和处理。通常用来要求程序自己正常退出,shell命令kill缺省产生这个信号。如果进程终止不了,我们才会尝试SIGKILL。

  1. SIGCHLD

子进程结束时, 父进程会收到这个信号。

如果父进程没有处理这个信号,也没有等待(wait)子进程,子进程虽然终止,但是还会在内核进程表中占有表项,这时的子进程称为僵尸进程。这种情 况我们应该避免(父进程或者忽略SIGCHILD信号,或者捕捉它,或者wait它派生的子进程,或者父进程先终止,这时子进程的终止自动由init进程 来接管)。

  1. SIGCONT

让一个停止(stopped)的进程继续执行. 本信号不能被阻塞. 可以用一个handler来让程序在由stopped状态变为继续执行时完成特定的工作. 例如, 重新显示提示符

  1. SIGSTOP

停止(stopped)进程的执行. 注意它和terminate以及interrupt的区别:该进程还未结束, 只是暂停执行. 本信号不能被阻塞, 处理或忽略.

  1. SIGTSTP

停止进程的运行, 但该信号可以被处理和忽略. 用户键入SUSP字符时(通常是Ctrl-Z)发出这个信号

  1. SIGTTIN

当后台作业要从用户终端读数据时, 该作业中的所有进程会收到SIGTTIN信号. 缺省时这些进程会停止执行.

  1. SIGTTOU

类似于SIGTTIN, 但在写终端(或修改终端模式)时收到.

  1. SIGURG

有”紧急”数据或out-of-band数据到达socket时产生.

  1. SIGXCPU

超过CPU时间资源限制. 这个限制可以由getrlimit/setrlimit来读取/改变。

  1. SIGXFSZ

当进程企图扩大文件以至于超过文件大小资源限制。

  1. SIGVTALRM

虚拟时钟信号. 类似于SIGALRM, 但是计算的是该进程占用的CPU时间.

  1. SIGPROF

类似于SIGALRM/SIGVTALRM, 但包括该进程用的CPU时间以及系统调用的时间.

  1. SIGWINCH

窗口大小改变时发出.

  1. SIGIO

文件描述符准备就绪, 可以开始进行输入/输出操作.

  1. SIGPWR

Power failure

  1. SIGSYS

非法的系统调用。

75、Swift中字符串、数组和字典是以结构体的形式实现的

76、Swift中的Array、Dictionay、String都是结构体,传递时会进行拷贝

77、在Swift中,单线区间是有Swift4.0版本带来的

78、使用runtime Associate方法关联的对象,不需要在助对象dealloc的时候释放

79、以下是常见的Crash场景

访问了将是对象

访问了野指针

数组越界

访问了不存在的方法

80、Swift中闭包是引用类型

81、weak属性不需要在dealloc中设置为nil

82、在Objective-C中,想nil对象发送消息不会到这crash

83、runtime会将weak对象放入hash表

84、autoreleasepool是以一个队列数组的形式实现的,主要通过那些函数完成
objc_autoreleasepoolPush
objc_autoreleasepoolPop
objc_autorelease
看函数名就可以知道,对 autorelease 分别执行 push,和 pop 操作。销毁对象时执行release操作。

85、Objective-C的load和initialize方法只会被调用一次

86、调用一个类的静态方法不需要release

87、Runloop可以做到:
使程序一直运行接受用户输入
决定程序在何时应该处理哪些Event
条用解耦
节省CPU时间
Run loop 剖析:
Runloop 接收的输入事件来自两种不同的源:输入源(intput source)和定时源(timer source)。输入源传递异步事件。通常消息来自于其他线程或程序。定时源则传递同步事件,发生在特定时间或者重复的时间间隔。两种源都使用程序的某一特定的处理历程来处理到达的时间。
基本作用:
保持程序的持续运行(一个死循环,使app不断运行)
处理App中的各种事件(触摸、定时器、Selector)
节省CPU资源、提高程序性能:该做事的时候做事,该休息的时候休息。
main 函数中的 RunLoop
UIApplicationMain函数内部就启动了一个RunLoop
所以UIApplicationMain 函数一直没有返回,保持了程序的持续运行
这个默认启动的 RunLoop 是跟主线程相关联的

上一篇下一篇

猜你喜欢

热点阅读