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)来访问。
自动合成(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告诉编译器,属性的setter与getter方法由用户自己实现,不自动生成。(当然对于readonly的属性只需提供getter即可)。假如一个属性被声明为@dynamic var,然后你没有提供@setter方法和@getter方法,编译的时候没问题,但是当程序运行到instance.var =someVar,由于缺setter方法会导致程序崩溃;或者当运行到 someVar = var时,由于缺getter方法同样会导致崩溃。编译时没问题,运行时才执行相应的方法,这就是所谓的动态绑定。
未完。。。
- IOS知识点mark
- iOS mark
- iOS mark地址
- iOS #pragma mark
- (小知识点)activity全透明,mark
- iOS学习1:#pragma mark
- iOS之#pragma mark用法
- iOS pragma mark的用法
- iOS#pragma mark的用法
- iOS 知识点
- IOS知识点
- IOS知识点
- iOS 知识点
- iOS知识点
- iOS知识点
- ios 知识点
- iOS知识点
- ios知识点
- C# web 链接数据库问题二三(一)
- Hadoop 笔记之shuffle详解过程
- "不忍直视"的ViewHolder模式
- dockerfile 创建 ssh 镜像
- 四种Toast的简单代码
- IOS知识点mark
- 理解JVM三步走
- 设计模式之状态模式
- 偶数哥德巴赫猜想
- JDK1.5新特性——Lock、Condition接
- 深入探索透视投影变换
- oracle 单行函数 指令
- 百度地图、 SurfaceView
- 关于 java.toString() ,(String),String.valueOf的区别