iOS基础概念总结(一)

2017/8/30 posted in  iOS

1. OC的前向声明

由于在编译 Person 类的文件时,不需要知道Dog类的全部细节(Dog类中的方法),若使用 #import "Dog.h" 则必须知道Dog.h的全部细节,而Person类中只需要知道类名Dog就可以了,可用通过以下方式告诉编译器@class Dog;这种方式叫向前声明 (forward declaring),当.m文件中要了解实现细节的时候在引入dog.h

//Person.h
#import <Foundation/Foundation.h>
@class Dog;  //前向声明
@interface Person : NSObject
@property (nonatomic, strong) NSString *name;
@property (nonatomic, strong) Dog *dog;

  • 向前声明解决了两个类互相引用的问题。
  • 向前声明可用降低编译时间,除非必要,则可以使用向前申明,并在实现文件中映入头文件,这样做可用尽量降低类之间的耦合。

2. #import和#include的区别?

#importObjective-C导入头文件的语法,可保证不会重复导入。
#include是C/C++导入头文件的语法,如果是objective-c与C/C++混编码,对于C/C++类型的文件,还是使用#include来引入,这种写法需要添加防重复导入的语法。

3. 用NSLog函数输出一个浮点类型,结果四舍五入,并保留一位小数

float money = 1.011;
NSLog(@"%.1f", money);

4.property属性的修饰符有什么样的作用

property是属性访问声明,扩号内支持以下几个属性:

  • getter=getName、setter=setName:设置setter与getter的方法名
  • readwrite、readonly:设置可供访问级别

  • assign:方法直接赋值,不进行任何retain操作,为了解决原类型与环循引用问题

  • retain:其setter方法对参数进行release旧值再retain新值,所有实现都是这个顺序

  • strong:此特质表明该属性定义了一种“拥有关系”(owning relationship)。为这种属性设置新值时,设置方法会先保留新值,并释放旧值,然后再将新值设置上去。

  • weak 此特质表明该属性定义了一种“非拥有关系”(nonowning relationship)。为这种属性设置新值时,设置方法既不保留新值,也不释放旧值。此特质同assign类似,然而在属性所指的对象遭到摧毁时,属性值也会清空(nil out)。

  • unsafe_unretained 此特质的语义和assign相同,但是它适用于“对象类型”(object type),该特质表达一种“非拥有关系”(“不保留”,unretained),当目标对象遭到摧毁时,属性值不会自动清空(“不安全”,unsafe),这一点与weak有区别

  • copy:其setter方法进行copy操作,与retain处理流程一样,先对旧值release,再copy出新的对象,retainCount为1。这是为了减少对上下文的依赖而引入的机制。

  • nonatomic:非原子性访问,不加同步, 多线程并发访问会提高性能。注意,如果不加此属性,则默认是两个访问方法都为原子型事务访问。

5. self.name=@object和_name=@object有什么不同?

self.name =”object”:会调用对象的setName()方法;name = “object”:会直接把"object"字符串赋值给当前对象的name属性。后者的效率会很高,因为没有调用set方法而是直接方法问内存。