2018.4.24
1.使用线程池的三大好处:
一是降低资源的消耗,通过重用已创建的线程来降低线程的创建和销毁的消耗。
二是提高响应速度,任务到达时不需要等待线程的创建就可以立即执行。
三是提高线程的可管理性,线程池可以统一管理、分配、监控和调优。
参考地址
2.Java通过ThreadPoolExecutor来实现对线程池的支持。
2018.5.2
使用LLVMClang 编译器的语法格式如下:
clang -fobjc-arc -framework <所需依赖的框架> <源文件> -o <生成文件>
举例如下:
clang -fobjc-arc -framework Foundation hello.m -o hello.out
2018.5.3
1.ObjectC提供了一个id类型,这个id类型可以代表所有对象的类型。也就是说,任意类的对象可赋值给id的类型的变量。
2.动态绑定是指ObjectC将会跟踪对象所属的类,它会在运行时判断该对象所属的方法,并在运行时确定动态需要调用的方法,而不是在编译时确定要调用的方法。
3.ObjectC形参个数可变的方法
-(void)test:(NSString*)name,...
{
va_list argList;
if(name)
{
NSLog(@"%@",name);
va_start(argList,name);
NSString* arg=va_arg(argList,id);
while(arg)
{
NSLog(@"%@",arg);
arg=va_arg(argList,id);
}
va_end(argList);
}
}
关键地方说明如下:
a.va_list:这是一个类型,用于定义指向可变参数列表的的指针。
b.va_start:这是一个函数,该函数指定开始处理可变形参的列表,并让指针变量指向可变形参列表的第一个参数
c.va_end:结束处理可变形参,释放指针变量。
d.var_arg:该函数返回获取指针当前指向的参数的值,并将指针移动到指向下一个参数。
4.ObjectC中static的说明
虽然Object-C也提供了static关键字,但是这个static关键字不能用于修饰成员变量,它只能修饰局部变量、全局变量和函数,
static修饰局部变量表示将该局部变量存储到静态存储区;
static修改全局变量用于限制该全局变量只能在当前源文件中访问;
static修改函数用于限制该函数只能在当前源文件中调用;
5.ObjectC中@package访问权限的说明
2018.5.4
-
ObjectC中让系统合成setter和getter方法只要如下两步:
a.在类接口部分使用@property指令定义属性。
b.在类实现的部分使用@synthesize指令声明该属性即可。
-
ObjectC 指示符
- assign:该指示符指定对属性只是进行简单赋值,不更改对所赋的值的引用计数。这个指示符主要适用于NSInteger等基础类型,以及short,float,double,结构体等各种c数据类型。
- 2.atomic(nonatomic):指定合成的存取方法是否为原子操作。所谓原子操作,主要指是否线程安全。如果使用atomic,那么合成的存、取方法都是线程安全的——当一个线程进入存、取方法的方法之后,其它线程无法进入该存、取方法,这样就可以避免多线程并发破坏对象的数据完整性,atomic是默认值。虽然atomic可以保证对象数据的完整性,但是atomic的线程安全会造成性能下降,因此,大多数单线程环境下,我们都会考虑使用nonatomic来提高存取方法的访问性能。
- 3.copy:如果使用copy指示符,当调用setter方法对成员变量赋值时,会将被赋值的对象复制一个副本,再将该副本赋值给成员变量。copy指示符会将原成员变量所引用的对象的引用计数减1.当成员变量的类型是可变类型,或其子类是可变类型时,被赋值的对象有可能在赋值之后被修改,如果程序不需要这种修改影响setter方法设置成员变量的时候,此时就可考虑使用copy指示符。
- 4.retain:使用retain指示符定义属性时,当把某个对象赋值给该属性时,该属性原来所引用的对象的引用计数减1,被赋值对象的引用计数加1.
- 5.strong、weak:strong指示符指定该属性对被赋值对象持有强引用,而weak指示符指定该属性对被赋值对象持有弱引用。强引用的意思是:只要该强引用指向被赋值的对象,那么该对象就不会自动回收;弱引用的意思:即使该弱引用指向被赋值的对象,该对象也可能被回收。
- 6.unsafe_unretained:这个指示符与weak指示符基本相似,对于只被unsafe_unretained指针所指向的对象,该对象也可能被回收。与weak指针不同的是,当unsafe_unretained指针所引用的对象被回收后,unsafe_unretained不会被赋为nil.因此可能导致程序崩溃。一般来说,使用unsafe_unretained指示符不如使用weak指示符。
-
setValue:id forKey:@"name"底层执行如下
- (1)程序优先考虑调用“setName:属性值;”代码通过settter方法完成设置。
- (2)如果该类没有setName:方法,KVC机制会搜索该类名为_name的成员变量,无论该成员变量是在类接口部分定义,还是在类实现部分定义,也无论用哪个访问控制符修饰,这个KVC代码底层实际上就是对_name成员变量赋值。
- (3)如果该类既没有setName:方法,也没有定义_name成员变量,KVC机制会搜索该类名为name的成员变量,无论该成员变量是在类接口部分定义,还是在类实现部分定义,也无论用哪个访问控制符修饰,这条KVC代码底层实现就是对name成员变量赋值。
- (4)如果上面3条都没有找到,系统会执行该对象的setValue:
forUnderfindedKey:方法。
-
"valueforKey@"name";"代码,底层的执行机制如下
- (1)程序优先考虑调用“name;”代码来获取该getter方法的返回值。
- (2)如果该类没有name方法,KVC机制会搜索该类名为_name的成员变量,无论该成员变量是在类接口部分定义,还是在类实现部分定义,也无论用哪个访问控制符修饰,这条KVC代码底层实际就是返回_name成员变量的值。
- (3)如果该类既没有name方法,也没有定义_name成员变量,KVC机制会搜索该类名为name的成员变量,无论定义在接口还是在类实现,也无论用哪个访问控制符修饰,这条KVC代码底层实际就是返回name成员变量的值。
- (4)如果上面3条都没有找到,系统将会执行该对象的valueforUndefinedKey:方法。
2018.5.8
Java 类的加载过程 Person person=new Person() 为例进行说明。
- (1)因为new用到Person.class,所以会先找到Person.class文件,并加载到内存中;
- (2)执行该类中的static代码块,如果有的话,给Person.class类进行初始化。
- (3)在堆内存中开辟空间分配内存地址。
- (4)在堆内存中建立对象的特有属性,并进行默认初始化;
- (5)对属性进行显示初始化
- (6)对对象进行构造代码块初始化;
- (7)对对象进行与之对应的构造函数进行初始化;
- (8)将内存地址付给栈内存中的person变量。
2018.5.9
Lua知识点
2018.5.13
android 知识点
BitmapFactory.options 重要属性
- (1)inJustDecodeBounds是boolean型变量,如果把它设置为true,在BitmapFactory.decodeXxx的时候并不会真正的返回一个Bitmap而是返回Bitmap的width和height,而且把这个width和height传到outWidth和outHeight这两个字段中。
- (2)inSampleSize是采样率,通过这个采样率我们可以极大的减少图片内存占用。
2018.5.22
JAVA编程思想
2018.5.25
java transient关键字使用
我们都知道一个对象只要实现了Serilizable接口,这个对象就可以被序列化,java的这种序列化模式为开发者提供了很多便利,我们可以不必关系具体序列化的过程,只要这个类实现了Serilizable接口,这个类的所有属性和方法都会自动序列化。
然而在实际开发过程中,我们常常会遇到这样的问题,这个类的有些属性需要序列化,而其他属性不需要被序列化,打个比方,如果一个用户有一些敏感信息(如密码,银行卡号等),为了安全起见,不希望在网络操作(主要涉及到序列化操作,本地序列化缓存也适用)中被传输,这些信息对应的变量就可以加上transient关键字。换句话说,这个字段的生命周期仅存于调用者的内存中而不会写到磁盘里持久化。
总之,java 的transient关键字为我们提供了便利,你只需要实现Serilizable接口,将不需要序列化的属性前添加关键字transient,序列化对象的时候,这个属性就不会序列化到指定的目的地中。
2018.5.26
java 不可变类的创建
2018.5.28
java 并发
在run()中对静态方法Thread.yield()的调用是对线程调试器(Java线程机制一部分,可以将cpu从一个线程转移到另一个线程)的一种建议,它在声明:"我已经执行完生命周期中最重要的部分了,此刻正是切换给其他任务执行一段时间的大好时机。"这就完全是选择性的。
Java提供了volatile关键字来保证可见性。文章地址
对于可见性,Java提供了volatile关键字来保证可见性。当一个共享变量被volatile修饰时,它会保证修改的值会立即被更新到主存,当有其他线程需要读取时,它会去内存中读取新值。而普通的共享变量不能保证可见性,因为普通共享变量被修改之后,什么时候被写入主存是不确定的,当其他线程去读取时,此时内存中可能还是原来的旧值,因此无法保证可见性。另外,通过synchronized和Lock也能够保证可见性,synchronized和Lock能保证同一时刻只有一个线程获取锁然后执行同步代码,并且在释放锁之前会将对变量的修改刷新到主存当中。因此可以保证可见性。
2018.5.30
webview加载网页出错
webview加载网页出错:ERR_UNKNOWN_URL_SCHEME
参考文章
2018.6.3
java元组 使用与存在意义
来自<java编程思想> p 355
java 注解的概念
注解也被称为元数据为我们在代码中添加信息提供一个形式化的方法,使我们可以稍后某个时刻非常方便地使用这些数据。
2018.6.22
1.注解元素可以的类型如下所示:
- 所有的基本类型(int float,boolean 等)
- String
- Class
- enum
- Annotation
- 以上类型的数组。
2.注解不支持继承
2018.06.25
1.阻塞队列
阻塞队列(BlockingQueue)是一个支持两个附加操作的队列。这两个附加的操作是:在队列为空时,获取元素的线程会等待队列变为非空。当队列满时,存储元素的线程会等待队列可用。阻塞队列常用于生产者和消费者的场景,生产者是往队列里添加元素的线程,消费者是从队列里拿元素的线程。阻塞队列就是生产者存放元素的容器,而消费者也只从容器里拿元素。