IOS知识点mark

来源:互联网 发布:tomcat apache nginx 编辑:程序博客网 时间:2024/05/16 06:10

之前看了一片博客《招一个靠谱的IOS》文章。里面好多面试题,但苦于没有答案,之前都是在baidu中慢慢寻找答案。所幸只好感叹互联网的强大,在微博里看到了

@iOS程序犭袁给出的参考答案。现在在自己的博客中记录一下。详细的内容看《招一个靠谱的IOS》和参考答案。

1.什么情况使用 weak 关键字,相比 assign 有什么不同?

什么情况使用weak字段

1.在ARC中,可能出现循环引用时,需要将其中一端设置为weak,比如delegate代理属性。

2.自身已经对它进行了一次强引用,就没必要再进行一次强引用了,此时可以使用weak。如自定义的IBOutlet控件属性一般都用weak。

不同点

1.weak必须用于OC对象,assign可以用于非OC对象。

2.weak属性所指对象遭到摧毁时,属性值也会清空(nil)。而assign所指对象遭到摧毁时,需要手动清空。assign只会执行针对“纯量变量”(scalar type,如CGFloatheh等)的简单赋值操作。

2.怎么使用copy

用途

1.NSString、NSArray、NSDictionary等经常使用copy关键字,因为他们有对应的可变类型:NSMutableString、NSMutableArray、NSMutableDictionary。使用copy是为了保护对象的封装性,因为传给设置方法的值可能是指向NSMutable...类型的实例,若此时不拷贝字符串,那么设置完属性后,字符串的值可能会在对象不知情时遭到更改。

2.block也经常使用copy字段。在ACR中写不写都可以,因为对于block使用copy还是strong效果都是一样,而写上copy能够提醒我们:编译器自动对block进行了copy。

3.@property (copy) NSMutableArray *array;这个写法会有什么问题?

问题

1.添加、删除、修改数组内元素时,程序会因为找不到对应方法而崩溃。因为copy就是复制一个不可变得NSArray对象。

2.使用了atomic属性会影响性能。该属性使用了同步锁,会在创建时生成一些额外的代码用于帮助编写多线程程序。

4.如何让自己的类用copy修饰符?如何重写带copy关键字的setter?

若要令自己所写的对象具有拷贝功能,则需要实现NSCopying协议。如果自定义的对象分为可变和不可变版本,那么需要同时实现NSCopying和NSMutableCopying协议。

具体步骤:

1.需要声明该类遵从NSCopying协议。

2.实现NSCopying的唯一方法,

- (id)copyWithZone:(NSZone *)zone;

3.如果是可变版本需要实现NSMutableCopying的方法

-(id)mutableCopyWithZone:(NSZone *)zone


如何重写带copy关键字的setter

- (void)setName:(NSString *)name {    //[_name release];    _name = [name copy];}

如果name是readonly,就在初始化方法中做copy

- (instancetype)initWithName:(NSString *)name {         if(self = [super init]) {            _name = [name copy];         }         return self;}

5.@property的本质是什么?ivar、getter、setter是如何生成并添加到这个类的

@property = ivar + getter + setter

“属性”(@property)有两大概念:实例变量(ivar)、存取方法(access method = getter + setter)。

“属性” (property)作为 Objective-C 的一项特性,主要的作用就在于封装对象中的数据。 Objective-C 对象通常会把其所需要的数据保存为各种实例变量。实例变量一般通过“存取方法”(access method)来访问。


ivar、 getter、setter是如何生成并添加到这个类的?

自动合成(autosynthesis)

完成属性定以后,编译器会自动编写访问这些属性所需的方法,此过程叫做“自动合成”(autosynthesis)。需要强调的是,这一过程是在编译期间执行的。除了生成方法代码getter、setter之外,编译器还要自动向类中添加适当的类型的实例变量,并且属性名前面添加下划线。

6.@protocol和category如何使用@property

7.runtime如何实现weak属性

8.@property有哪些属性关键字?后面可以有哪些修饰符?

1.原则性 ---nonatomic

2.读/写权限 ---readwrite、readonly

3.内存管理语义 ---assign、strong、weak、unsafe_unretained、copy、retain

4.方法名 ---getter=<name>、setter=<name>(不常用)

9.weak属性需要在dealloc中置nil么?

不需要

ARC下会自动帮我们处理

10.@synthesize和@dynamic分别有什么作用?

1.@property有两个对应的词,一个是@synthesize,一个是@dynamic。如果都没有写,那么默认是@synthesize var = _var;

2.@sythesize的语义是如果你没有手动实现setter方法和getter方法,那么编译器会自动为你加上这两个方法。

3.@dynamic诉编译器,属性的settergetter方法由用自己实现,不自生成。(当然对于readonly的属性只需提供getter即可)。假如一个属性被声明为@dynamic var,然后你没有提供@setter方法和@getter方法,编译的时候没问题,但是当程序运行到instance.var =someVar,由于缺setter方法会导致程序崩溃;或者当运行到 someVar = var时,由于缺getter方法同样会导致崩溃。编译时没问题,运行时才执行相应的方法,这就是所谓的动态绑定。


未完。。。

0 0
原创粉丝点击