iOS 基础知识点
1.SDWebImage缓存策略
缓存策略2.为什么说OC是一门动态语言?
Objective-C 可以通过Runtime 这个运行时机制,在运行时动态的添加变量、方法、类等,所以说Objective-C 是一门动态的语言
3.属性@property 的本质是什么?
@property = ivar + getter + setter;
实例变量+get方法+set方法,也就是说使用@property 系统会自动生成setter和getter方法。
4.NSString为什么要用copy关键字,如果用strong会有什么问题?
copy是深拷贝,strong是强引用,比如
@property(nonatomic,copy)NSString * str1;
@property(nonatomic,strong)NSString*str2;
NSMutableString*str=[NSMutableString stringWithFormat:@"helloworld"];
self.str1=str;
self.str2=str;
如果改变str, [str appendString:@"world"];
那么str1是不会变化的,而str2,则会发生变化。通常我们是不希望字符串随着别的变量发生变化而变化的。所以NSString一般用copy。
5.如何令自己所写的对象具有拷贝功能?
具体步骤:
• 需声明该类遵从 NSCopying 协议
• 实现 NSCopying 协议。该协议只有一个方法:
- (id)copyWithZone:(NSZone *)zone;
6.可变集合类 和 不可变集合类的 copy 和 mutablecopy有什么区别?
使用copy时 可变集合的指针地址以及内存地址都不相同 深复制 不可变集合的指针地址不一样但是内存地址一样 属于浅复制;
使用mutableCopy的时候无论是可变集合还是不可变集合的指针地址和内存地址都不同 都属于深复制
7.为什么IBOutlet修饰的UIView也适用weak关键字
我们将控件拖到Storyboard上,相当于创建了一个对象,而这个对象是加到试图控制器的view上,存放在view的subviews数组中。即我们的控件对象是属于的view的,view对其子控件之前的关系是强引用。当我们使用Outlet属性的时候,这个Outlet属性是有view来进行强引用的。我们是在viewController中仅仅对其进行使用,没有必要拥有它,所以使用weak进行修饰。
8.nonatomic和atomic的区别?atomic是绝对的线程安全么?为什么?如果不是,那应该如何实现?
nonatomic和atomic用来决定编译器生成的getter和setter操作是否为原子操作。atomic不是绝对的线程安全。atomic的本意是指属性的存取方法是线程安全的,并不保证整个对象是线程安全的。如:
声明一个NSMutableArray的原子属性stuff,此时self.stuff 和 self.stuff = otherstuff都是线程安全的。但是使用[self.stuff objectAtIndex:index]就不是线程安全的。需要用互斥锁来保证线程安全性。
9.@synthesis和@dynamic的作用
@property有两个对应的词,一个是@synthesis一个是@dynamic。若两者都没有写,默认的就是:
@syntheszie var = _var;
@synthesis的语义是如果你没有手动实现setter和getter方法,那么编译器会自动为你加上这两个方法
@dynamic告诉编译器:属性的setter和getter方法由开发者自己实现,不需要自动生成。(对于readonly的属性只需提供getter即可)加入一个属性被声明为
@dynamic var;
然后你也没有提供@setter和@getter方法,可以通过编译,但是运行的时候,程序运行至
instance.var = someVar
会因为缺少setter方法而crash。同样如果缺失getter方法,程序运行至
someVar = instance.var
时导致crash。
10.为什么代理要用weak?week 和 assign 的区别?block和代理的区别?
(1)weak修饰代理属性,指明该对象并不负责保持delegate这个对象。delegate这个对象的销毁又外部控制
(2)weak和assign的不同点:weak策略在属性所指的对象遭到销毁时,系统会将weak修饰的属相对象的指针置为nil,在OC给nil发消息是不会有什么问题的。如果是用assign,在属性所指的对象销毁之后,属性对象的指针并为置为nil,造成野指针的存在。这个时候再次给此对象发送消息,极易造成崩溃问题。assign可以用于修饰非OC对象,而weak必须勇于OC对象。
(3)block和代理的区别:
block更轻型,是用也更简单,能够直接访问上下文,类中不需要存储临时数据,使用block,代码连贯,易读。delegate需要实现接口,与方法实现进行分离,需要存储一些临时数据。代码比较分离,不易读。但是可以在很大程度上实现代码的解耦。
block根据使用分类,有三种情形:
a.临时性的,只用在栈中,不会存储起来
b.需要存储起来,但只会调用一次,或者一个完成时期。比如一个UIView动画,动画完成之后,需要使用block通知外面。一旦调用block之后,这个block就可以删除掉
c.需要存储起来,可能会调用多次。比如按钮的点击事件,假如采用block实现,这种block就需要长期存储,并且会调用多次。调用之后block也会删除,可能还有下一次按钮的点击。
对于临时性的,只在栈中使用的block,没有循环引用的问题。block会自动释放掉。而只调用一次的block,就需要看内部的实现了。正确的实现时block调用之后,吗上赋值为空。这样block也会释放掉,同样也不会引起循环引用。
多次调用的block,极易引起循环引用,使用时需要注意。