iOS开发代码段iOS Developer程序员

iOS开发-OC语言的一些区别

2016-07-01  本文已影响436人  niceSYT

在学iOS中遇到的一些语言区别

1.OC语言的和基本特点

OC语言是C语言的一个超集,只是在C的基础上加上了面向对象的特性;

OC与Java语言相同的是都有单继承,这一点与C++语言不同(多重继承);

OC不支持命令空间机制,取而代之的是在类名之前添加前缀,一次来区分 ;

2.#include有#import的区别,#import与@class的区别

(1)#include与#import的区别:#include和#import其效果相同,只是后者不会引起交叉编译,确保头文件只会被导入一次.

(2)#import与@class的区别:import包含这个类的所有信息,包括实体变量和方法,而@class只是告诉编译器,其后面声明的名称是类的名称,至于这些类是如何定义的,暂时不用考虑,后面会再告诉你,使用@import编译效率高,防止相互包含的编译错误.

3.内存管理基本原则

如果使用啊alloc,copy(mutableCopy)或者retain一个对象时,我们就有义务,向他发送一条release或者autorelease消息,其它方法创建的对象,不需要由我们来管理内存

4.什么是ARC技术?与GC是否相同?

ARC是Automatic Reference Counting 的简称,我们称为自动引用技数,是iOS5.0之后推出的内存管理的新特性.本质上还是引用计数来管理对象,只是我们在编写代码时,不需要像对象发送release或者autorelease方法,也不可以调用delloc的方法,编译器会在合适的位置自动给用户生成release消息(autorelease).GC的全称是(garbage collection),内存垃圾回收机制,ARC比GC性能好!

iOS开发只支持手动内存管理与ARC.Mac开发支持GC垃圾回收机制,10.8之后弃用了GC,推荐使用ARC.

5.浅复制与深复制的基本概念和区别

浅复制:只复制对象本身,不对里面的属性复制

深复制:不仅复制对象本身,对象持有的属性对象也做复制

6.定义属性时,什么时候用assign,retain,copy,nonatomic

(1)assign:普通赋值,一般常用于基本数据类型,常见委托设计模式.以此来防止循环引用.

(2)retain:保留计数,获得到了对象的所有权,引用计数子啊原有的基础上加1.

(3)copy:用来复制对象,一般字符串使用copy,Foundation中的不可变对象使用copy效果相当于retain,只是引用计数+1;

(4)nonatomic:非原子性访问,不加同步,多线程并发访问会提高性能.

7.strong与weak,_unsafe_unretained与weak的区别

(1)strong叫强引用,weak叫弱引用,在ARC中,使用strong告诉编译器帮助我们自动插入retain,weak是普通赋值相当于手动管理内存的assign.

(2)_unsafe_unretained与weak功能一样,区别在于当指向对象销毁后,weak会将变量置为nil,防止调用野指针(没有指向的指针变量).

8.常见的设计模式

单例设计 代理设计 观察者(通知) 工程方法  模板方法

9.iOS开发中 数据持久性有

plist文件写入  对象归档    sqlite数据库    coredata

10.线程有进程的区别和联系

一般的应用程序是单个进程,也有多进程(谷歌浏览器),进程是个静态的容器,里面容纳了很多个线程,线程是一系列方法的线性执行路径.

11.@synthesizer与@dynamic

(1).@synthesize是系统自动生成getter和setter属性声明

(2).@dynamic的意思是告诉编译器,属性的获取与赋值方法由用户自己实现,不自动生成.

12.Google的GDataXML也是基于libxml2的,因此在使⽤用 GDataXML之前,你需要先导⼊入libxml2,此⽅方法为dom解 析⽅方法。

dom实现的原理是把整个xml⽂文档⼀一次性读出,放在⼀一个 树型结构⾥里。在需要的时候,查找特定节点,然后对节点 进⾏行读或写。他的主要优势是实现简单,读写平衡;缺点 是⽐比较占内存,因为他要把整个xml⽂文档都读⼊入内存,⽂文 件越⼤大,这种缺点就越明显。

sax的实现⽅方法和dom不同。他只在xml⽂文档中查找特定 条件的内容,并且只提取需要的内容。这样做占⽤用内存 ⼩小,灵活,正好满⾜足我们的需求。他的缺点就是写,有些 资料介绍了写⼊入的⽅方法,但是我感觉这对本例没有必要。 运⾏行NSXMLParser涉及设置、运⾏行和响应结果。

13.ARC自动引用计数机制

Cocoa采用了引用计数(reference counting)机制,每一个对象有一个关联的“整数retainCount”用于记录对象的使用情况。对象被引用时retaincount+1,外部环境结束对象的使用后retainCount-1.当retaincount为0的时候,该对象被销毁。

当我们使用alloc、new或者copy的我们需要销毁这个对象。release函数,只是将对象的retainCount值减1,并不是删除对象。当retainCount==0的时候,系统会发给对象一个dealloc消息,另外:千万不要手动调用dealloc,因为我们不知道何时,何地,何人还会使用该对象。应该老老实实依赖引用计数机制完成内存管理。

释放对象所有权的函数除了release还有autorelease,这是一种延迟操作。

14.self.name与_name的区别

(1).首先通过self.xxx 通过访问的方法的引用:包含了set和get方法。而通过下划线是获取自己的实例变量,不包含set和get的方法。

(2).self.xxx是对属性的访问;而xxx是对局部变量的访问。所有被声明为属性的成员,再ios5之前需要使用编译指令@synthesize 来告诉编译器帮助生成属性的getter和setter方法,之后这个指令可以不用认为的指定了,默认情况下编译器会帮助我们生成。编译器在生成getter,setter方法时是有优先级的,他首先查找当前的类中用户是否定义属性的getter,setter方法,如果有,则编译器会跳过,不会再生成,使用用户定义的方法。也就是说你在使用self.xxx时是调用一个getter方法。会使引用计数加一,而xxx不会使用引用技术加一的。

所有使用self.xxx是更好的选择,因为这样可以兼容懒加载,同时也避免了使用下滑线的时候忽略了self这个指针,后者容易在BLock中造成循环引用。同时,使用 _是获取不到父类的属性,因为它只是对局部变量的访问。

最后总结:self方法实际上是用了get和set方法间接调用,下划线方法是直接对变量操作。

15.如何理解 retain/copy/assign/release/autor release/dealloc关键字?

copy:建立一个索引计数为1的对象,然后释放旧对象,主要用于nsstring;

retain:释放旧的对象,将旧对象的值赋予输入对象,再提高输入对象的索引计数为1

对其他NSObject和其子类

assign: 简单赋值,不更改索引计数

release:手动释放对象;

dealloc:它的作用是,当对象的引用计数为0,系统会自动调用dealloc方法,回收内存。

autorelease 原理:

a.先建立一个autorelease pool

b.对象从这个autorelease pool里面生成。

c.对象生成 之后调用autorelease函数,这个函数的作用仅仅是在autorelease pool中做个标记,让pool记得将来release一下这个对象。

d.程序结束时,pool本身也需要rerlease, 此时pool会把每一个标记为autorelease的对象release一次。如果某个对象此时retain count大于1,这个对象还是没有被销毁。

(weak和strong)不同的是 当一个对象不再有strong类型的指针指向它的时候 它会被释放 ,即使还有weak型指针指向它。weak表示如果还没有人指向它了,它就会被清除内存,同时被指向nil

16.继承 与 类别 的联系与区别

联系:

可以给一个类扩展新的方法,或修改已有的方法

区别:

1. 继承修改的方法不会对父类原方法产生影响;类别修改的方法相当于替换了原有方法

2. 以viewController举例,继承一个viewController相当于建立一个新的页面;而给一个viewController添加类别用于增加或修改原viewController上的方法

3. 类别支持开发人员针对自己构建的类,把相关的方法分组到多个单独的文件中,对于大型而复杂的类,这有助于提高可维护性,并简化单个源文件的管理。

4. 针对系统提供的一些类,例如:NSString,NSArray,NSNumber等类,系统本身不提倡使用继承去扩展方法,因为这些类内部实现对继承有所限制,所以最后使用类别来进行方法扩展。

5. 理论上类别不能新增属性

17 Strong与Weak的区别

(weak和strong)不同的是 当一个对象不再有strong类型的指针指向它的时候 它会被释放 ,即使还有weak型指针指向它。  一旦最后一个strong型指针离去 ,这个对象将被释放,所有剩余的weak型指针都将被清除。  可能有个例子形容是妥当的。  想象我们的对象是一条狗,狗想要跑掉(被释放)。  strong型指针就像是栓住的狗。只要你用牵绳挂住狗,狗就不会跑掉。如果有5个人牵着一条狗(5个strong型指针指向1个对象),除非5个牵绳都脱落 ,否着狗是不会跑掉的。  weak型指针就像是一个小孩指着狗喊到:“看!一只狗在那” 只要狗一直被栓着,小孩就能看到狗,(weak指针)会一直指向它。只要狗的牵绳脱落,狗就会跑掉,不管有多少小孩在看着它。

只要最后一个strong型指针不再指向对象,那么对象就会被释放,同时所有的weak型指针都将会被清除。

上一篇下一篇

猜你喜欢

热点阅读