2018.4.24
1.使用線程池的三大好處:
一是降低資源的消耗双抽,通過重用已創(chuàng)建的線程來降低線程的創(chuàng)建和銷毀的消耗募狂。
二是提高響應速度骤宣,任務到達時不需要等待線程的創(chuàng)建就可以立即執(zhí)行。
三是提高線程的可管理性撞牢,線程池可以統(tǒng)一管理、分配叔营、監(jiān)控和調(diào)優(yōu)屋彪。
參考地址
2.Java通過ThreadPoolExecutor來實現(xiàn)對線程池的支持。
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.動態(tài)綁定是指ObjectC將會跟蹤對象所屬的類,它會在運行時判斷該對象所屬的方法,并在運行時確定動態(tài)需要調(diào)用的方法勘究,而不是在編譯時確定要調(diào)用的方法矮湘。
3.ObjectC形參個數(shù)可變的方法
-(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);
}
}
關(guān)鍵地方說明如下:
a.va_list:這是一個類型,用于定義指向可變參數(shù)列表的的指針口糕。
b.va_start:這是一個函數(shù)缅阳,該函數(shù)指定開始處理可變形參的列表,并讓指針變量指向可變形參列表的第一個參數(shù)
c.va_end:結(jié)束處理可變形參景描,釋放指針變量十办。
d.var_arg:該函數(shù)返回獲取指針當前指向的參數(shù)的值,并將指針移動到指向下一個參數(shù)超棺。
4.ObjectC中static的說明
雖然Object-C也提供了static關(guān)鍵字向族,但是這個static關(guān)鍵字不能用于修飾成員變量,它只能修飾局部變量棠绘、全局變量和函數(shù)件相,
static修飾局部變量表示將該局部變量存儲到靜態(tài)存儲區(qū);
static修改全局變量用于限制該全局變量只能在當前源文件中訪問氧苍;
static修改函數(shù)用于限制該函數(shù)只能在當前源文件中調(diào)用夜矗;
5.ObjectC中@package訪問權(quán)限的說明
2018.5.4
-
ObjectC中讓系統(tǒng)合成setter和getter方法只要如下兩步:
a.在類接口部分使用@property指令定義屬性。
b.在類實現(xiàn)的部分使用@synthesize指令聲明該屬性即可让虐。
-
ObjectC 指示符
- assign:該指示符指定對屬性只是進行簡單賦值紊撕,不更改對所賦的值的引用計數(shù)。這個指示符主要適用于NSInteger等基礎(chǔ)類型赡突,以及short,float,double,結(jié)構(gòu)體等各種c數(shù)據(jù)類型对扶。
- 2.atomic(nonatomic):指定合成的存取方法是否為原子操作。所謂原子操作麸俘,主要指是否線程安全辩稽。如果使用atomic,那么合成的存、取方法都是線程安全的——當一個線程進入存从媚、取方法的方法之后逞泄,其它線程無法進入該存、取方法拜效,這樣就可以避免多線程并發(fā)破壞對象的數(shù)據(jù)完整性喷众,atomic是默認值。雖然atomic可以保證對象數(shù)據(jù)的完整性紧憾,但是atomic的線程安全會造成性能下降到千,因此,大多數(shù)單線程環(huán)境下赴穗,我們都會考慮使用nonatomic來提高存取方法的訪問性能憔四。
- 3.copy:如果使用copy指示符膀息,當調(diào)用setter方法對成員變量賦值時,會將被賦值的對象復制一個副本了赵,再將該副本賦值給成員變量潜支。copy指示符會將原成員變量所引用的對象的引用計數(shù)減1.當成員變量的類型是可變類型,或其子類是可變類型時柿汛,被賦值的對象有可能在賦值之后被修改冗酿,如果程序不需要這種修改影響setter方法設(shè)置成員變量的時候,此時就可考慮使用copy指示符络断。
- 4.retain:使用retain指示符定義屬性時裁替,當把某個對象賦值給該屬性時,該屬性原來所引用的對象的引用計數(shù)減1貌笨,被賦值對象的引用計數(shù)加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"底層執(zhí)行如下
- (1)程序優(yōu)先考慮調(diào)用“setName:屬性值;”代碼通過settter方法完成設(shè)置座哩。
- (2)如果該類沒有setName:方法,KVC機制會搜索該類名為_name的成員變量粮彤,無論該成員變量是在類接口部分定義根穷,還是在類實現(xiàn)部分定義,也無論用哪個訪問控制符修飾导坟,這個KVC代碼底層實際上就是對_name成員變量賦值屿良。
- (3)如果該類既沒有setName:方法,也沒有定義_name成員變量,KVC機制會搜索該類名為name的成員變量惫周,無論該成員變量是在類接口部分定義尘惧,還是在類實現(xiàn)部分定義,也無論用哪個訪問控制符修飾递递,這條KVC代碼底層實現(xiàn)就是對name成員變量賦值喷橙。
- (4)如果上面3條都沒有找到啥么,系統(tǒng)會執(zhí)行該對象的setValue:
forUnderfindedKey:方法。
-
"valueforKey@"name";"代碼重慢,底層的執(zhí)行機制如下
- (1)程序優(yōu)先考慮調(diào)用“name;”代碼來獲取該getter方法的返回值饥臂。
- (2)如果該類沒有name方法,KVC機制會搜索該類名為_name的成員變量似踱,無論該成員變量是在類接口部分定義,還是在類實現(xiàn)部分定義稽煤,也無論用哪個訪問控制符修飾核芽,這條KVC代碼底層實際就是返回_name成員變量的值。
- (3)如果該類既沒有name方法酵熙,也沒有定義_name成員變量轧简,KVC機制會搜索該類名為name的成員變量,無論定義在接口還是在類實現(xiàn)匾二,也無論用哪個訪問控制符修飾哮独,這條KVC代碼底層實際就是返回name成員變量的值。
- (4)如果上面3條都沒有找到察藐,系統(tǒng)將會執(zhí)行該對象的valueforUndefinedKey:方法皮璧。
2018.5.8
Java 類的加載過程 Person person=new Person() 為例進行說明。
- (1)因為new用到Person.class,所以會先找到Person.class文件分飞,并加載到內(nèi)存中悴务;
- (2)執(zhí)行該類中的static代碼塊,如果有的話譬猫,給Person.class類進行初始化讯檐。
- (3)在堆內(nèi)存中開辟空間分配內(nèi)存地址。
- (4)在堆內(nèi)存中建立對象的特有屬性染服,并進行默認初始化别洪;
- (5)對屬性進行顯示初始化
- (6)對對象進行構(gòu)造代碼塊初始化;
- (7)對對象進行與之對應的構(gòu)造函數(shù)進行初始化柳刮;
- (8)將內(nèi)存地址付給棧內(nèi)存中的person變量挖垛。
2018.5.9
Lua知識點
2018.5.13
android 知識點
BitmapFactory.options 重要屬性
- (1)inJustDecodeBounds是boolean型變量,如果把它設(shè)置為true诚亚,在BitmapFactory.decodeXxx的時候并不會真正的返回一個Bitmap而是返回Bitmap的width和height晕换,而且把這個width和height傳到outWidth和outHeight這兩個字段中。
- (2)inSampleSize是采樣率站宗,通過這個采樣率我們可以極大的減少圖片內(nèi)存占用闸准。
2018.5.22
JAVA編程思想
2018.5.25
java transient關(guān)鍵字使用
我們都知道一個對象只要實現(xiàn)了Serilizable接口,這個對象就可以被序列化梢灭,java的這種序列化模式為開發(fā)者提供了很多便利夷家,我們可以不必關(guān)系具體序列化的過程蒸其,只要這個類實現(xiàn)了Serilizable接口,這個類的所有屬性和方法都會自動序列化库快。
然而在實際開發(fā)過程中摸袁,我們常常會遇到這樣的問題,這個類的有些屬性需要序列化义屏,而其他屬性不需要被序列化靠汁,打個比方,如果一個用戶有一些敏感信息(如密碼闽铐,銀行卡號等)蝶怔,為了安全起見,不希望在網(wǎng)絡操作(主要涉及到序列化操作兄墅,本地序列化緩存也適用)中被傳輸踢星,這些信息對應的變量就可以加上transient關(guān)鍵字。換句話說隙咸,這個字段的生命周期僅存于調(diào)用者的內(nèi)存中而不會寫到磁盤里持久化沐悦。
總之,java 的transient關(guān)鍵字為我們提供了便利五督,你只需要實現(xiàn)Serilizable接口藏否,將不需要序列化的屬性前添加關(guān)鍵字transient,序列化對象的時候概荷,這個屬性就不會序列化到指定的目的地中秕岛。
2018.5.26
java 不可變類的創(chuàng)建
2018.5.28
java 并發(fā)
在run()中對靜態(tài)方法Thread.yield()的調(diào)用是對線程調(diào)試器(Java線程機制一部分,可以將cpu從一個線程轉(zhuǎn)移到另一個線程)的一種建議误证,它在聲明:"我已經(jīng)執(zhí)行完生命周期中最重要的部分了继薛,此刻正是切換給其他任務執(zhí)行一段時間的大好時機。"這就完全是選擇性的愈捅。
Java提供了volatile關(guān)鍵字來保證可見性遏考。文章地址
對于可見性,Java提供了volatile關(guān)鍵字來保證可見性蓝谨。當一個共享變量被volatile修飾時灌具,它會保證修改的值會立即被更新到主存,當有其他線程需要讀取時譬巫,它會去內(nèi)存中讀取新值咖楣。而普通的共享變量不能保證可見性,因為普通共享變量被修改之后芦昔,什么時候被寫入主存是不確定的诱贿,當其他線程去讀取時,此時內(nèi)存中可能還是原來的舊值,因此無法保證可見性珠十。另外料扰,通過synchronized和Lock也能夠保證可見性,synchronized和Lock能保證同一時刻只有一個線程獲取鎖然后執(zhí)行同步代碼焙蹭,并且在釋放鎖之前會將對變量的修改刷新到主存當中晒杈。因此可以保證可見性。
2018.5.30
webview加載網(wǎng)頁出錯
webview加載網(wǎng)頁出錯:ERR_UNKNOWN_URL_SCHEME
參考文章
2018.6.3
java元組 使用與存在意義
來自<java編程思想> p 355
java 注解的概念
注解也被稱為元數(shù)據(jù)為我們在代碼中添加信息提供一個形式化的方法孔厉,使我們可以稍后某個時刻非常方便地使用這些數(shù)據(jù)拯钻。
2018.6.22
1.注解元素可以的類型如下所示:
- 所有的基本類型(int float,boolean 等)
- String
- Class
- enum
- Annotation
- 以上類型的數(shù)組。
2.注解不支持繼承
2018.06.25
1.阻塞隊列
阻塞隊列(BlockingQueue)是一個支持兩個附加操作的隊列撰豺。這兩個附加的操作是:在隊列為空時说庭,獲取元素的線程會等待隊列變?yōu)榉强铡.旉犃袧M時郑趁,存儲元素的線程會等待隊列可用。阻塞隊列常用于生產(chǎn)者和消費者的場景姿搜,生產(chǎn)者是往隊列里添加元素的線程寡润,消費者是從隊列里拿元素的線程。阻塞隊列就是生產(chǎn)者存放元素的容器舅柜,而消費者也只從容器里拿元素梭纹。