iOS几个小知识点的总结
2017-07-11 10:09
197 查看
1.assin与weak的区别:
相同点:都是弱引用。
区别:assin如果引用的OC对象销毁了, 指针并不会被自动清空, 依然指向销毁的对象(很容易产生野指针错误: EXC_BAD_ACCESS) weak如果引用的OC对象销毁了, 指针会被自动清空(变为nil), 不再指向销毁的对象(永远不会产生野指针错误)
用途:assign一般用在基本数据类型上面, 比如int\double等。weak一般用在代理对象上面, 或者用来解决循环强引用的问题。
2.如何获取类的私有属性:
iOS获取类的私有属性的方法一般有两种,KVC(key valued coding)和OC的RunTIme机制。比如一个属性name在类的.m文件中或者用@private修饰,
KVC:先实例化这个类,赋值的话调用- (void)setValue:(nullable id)value forKey:(NSString *)key,取值的话调用- (nullable id)valueForKey:(NSString *)key
RunTIme机制获取:(Ivar:定义对象的实例变量,包括类型和名字。)
3._XXX与self.XXX的区别:
这个举个例子吧,一般是在类上声明一个属性
@property (strong, nonatomic) UIWindow *window;
这时编译器会自动合成一套setter和getter方法
- (void)setWindow;
- (UIWindow *)window;
还有一个实例变量_window;
setter和getter方法分别是对该实例变量的存取
95ea
点语法展开来就是一个setter或getter方法
self.windows = XXX就是调用自身的setter方法,_window = XXX是绕过setter方法直接对实例变量进行赋值
在lazy loading里我们先判断该实例变量是否已经被初始化,如果没有则初始化。所以需要覆盖getter方法。
而因为点语法实际上是调用setter或getter,比直接访问自身实例变量多了一层,所以速度上会慢,但是那个时间在现在的CPU速度下简直可以忽略。除非你在setter或getter里进行了大量的计算。
相同点:都是弱引用。
区别:assin如果引用的OC对象销毁了, 指针并不会被自动清空, 依然指向销毁的对象(很容易产生野指针错误: EXC_BAD_ACCESS) weak如果引用的OC对象销毁了, 指针会被自动清空(变为nil), 不再指向销毁的对象(永远不会产生野指针错误)
用途:assign一般用在基本数据类型上面, 比如int\double等。weak一般用在代理对象上面, 或者用来解决循环强引用的问题。
2.如何获取类的私有属性:
iOS获取类的私有属性的方法一般有两种,KVC(key valued coding)和OC的RunTIme机制。比如一个属性name在类的.m文件中或者用@private修饰,
KVC:先实例化这个类,赋值的话调用- (void)setValue:(nullable id)value forKey:(NSString *)key,取值的话调用- (nullable id)valueForKey:(NSString *)key
RunTIme机制获取:(Ivar:定义对象的实例变量,包括类型和名字。)
unsigned int outCount = 0; Ivar *ivars = class_copyIvarList([类名 class], &outCount); for (NSInteger i = 0; i < outCount; ++i) { // 遍历取出该类成员变量 Ivar ivar = *(ivars + i); NSLog(@"\n name = %s \n type = %s", ivar_getName(ivar),ivar_getTypeEncoding(ivar)); } // 根据内存管理原则释放指针 free(ivars);
3._XXX与self.XXX的区别:
这个举个例子吧,一般是在类上声明一个属性
@property (strong, nonatomic) UIWindow *window;
这时编译器会自动合成一套setter和getter方法
- (void)setWindow;
- (UIWindow *)window;
还有一个实例变量_window;
setter和getter方法分别是对该实例变量的存取
95ea
点语法展开来就是一个setter或getter方法
self.windows = XXX就是调用自身的setter方法,_window = XXX是绕过setter方法直接对实例变量进行赋值
在lazy loading里我们先判断该实例变量是否已经被初始化,如果没有则初始化。所以需要覆盖getter方法。
而因为点语法实际上是调用setter或getter,比直接访问自身实例变量多了一层,所以速度上会慢,但是那个时间在现在的CPU速度下简直可以忽略。除非你在setter或getter里进行了大量的计算。
相关文章推荐
- 一个普通 iOS 码农的几个小项目相关知识点总结
- 有关存储过程的几个知识点总结
- 有关View的几个基础知识点-IOS开发
- 总结iOS 开发的几个常用代码
- IOS应用内购买(IAP)开发时遇到的几个问题总结
- 有关UIView、subview的几个基础知识点-IOS开发 (实例)
- pl/sql语言的中几个知识点的总结(一)
- iOS知识点总结——复习大纲
- 有关UIView、subview的几个基础知识点-IOS开发 (实例)(转)
- UIView、subview的几个基础知识点-iOS开发(实例
- ios开发之某些知识点总结
- 有关View的几个基础知识点-IOS开发
- 有关View的几个基础知识点-IOS开发
- ios 知识点总结
- 有关UIView、subview的几个基础知识点-IOS开发 (实例)
- 有关View的几个基础知识点-IOS开发
- C语言中的几个容易混淆的知识点总结
- 有关View的几个基础知识点-IOS开发
- 有关UIView、subview的几个基础知识点-IOS开发
- 有关View的几个基础知识点-IOS开发