1,QQ上的消息拖動變形的實現:
上面顯示了數字,如果可以點擊用UIButton實現。重寫UIButton,添加一個pan手勢,在自身的原來位置添加的一個UIView originView,作為起始點,插入到superView的底部,拖動時算出距離,根據距離大小改變originView的大小。然后通過貝塞爾曲線(控制點在originView的邊緣與中心線平行的中點上)繪制CAShapLayer插入到superView的底層中。
2,不對#號編碼:(字符集中是需要編碼的字符集合)
- (NSString *)concatenatedCoding:(NSString *)urlPath
{
NSCharacterSet *uRLCombinedCharacterSet = [[NSCharacterSet characterSetWithCharactersInString:@" \"+%<>[\\]^`{|}/"] invertedSet];
urlPath = [urlPath stringByAddingPercentEncodingWithAllowedCharacters:uRLCombinedCharacterSet];
return urlPath;
}
3,得到文字的拉丁字母(漢字拼音):
NSString *input = @"Hello! こんにちは! ??????! ?????! 您好!";
NSString *processing = [input stringByApplyingTransform:NSStringTransformToLatin reverse:NO];
processing = [processing stringByApplyingTransform:NSStringTransformStripDiacritics reverse:NO];
NSArray*output = [processing.localizedLowercaseString
componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
NSLog(@"%@", output);
// ["hello!", "kon'nichiha!", "swasdi!", "mrhba!", "nin", "hao!"]
4,runloop:
主要的模式有DefaultMode和TrackingRunLoopMode,在滑動時TrackingRunLoopMode模式,在加入commonMode時,在DefaultMode和TrackingRunLoopMode模式都能執行,這兩個模式都標記了commonMode的屬性。
5,看ios系統的市場占有率:
https://developer.apple.com/support/app-store/
6,創建常駐線程:
http://www.lxweimin.com/p/bc04369ce69d.
在thread的事件中給當前runloop添加一個source。[currentRunloop run];
7,多線程使用GCD和NSOperationQunue而不直接使用NSTread的原因:
多線程使用GCD和NSOperationQunue而不直接使用NSTread不僅僅是因為操作的便捷,主要是因為使用NSTread無法保證總的線程數,多線程能夠高效運行與CPU的核數息息相關。單個使用NSTread沒問題,但總體無法確保總線程的個數,會造成一個連續不斷的扇出的問題。GCD和NSOperationQunue底層維持了一個線程池,能夠根據CPU的性能,合理分配線程。在使用它們時不必關系線程,而是抽象成任務和隊列。
8,-[UIKeyboardLayoutStar release]: message sent to deallocated instance ?從后臺切到前臺就會崩潰,并報這個錯誤,百度發現是同時替換可變和不可變數組的objectAtIndex:方法就會報錯,單獨替換不可變的方法不會.
9,很多時候傳商品訂單id到后臺,后臺都需要傳其他的類型到后臺才能判斷是什么類型的訂單,這樣的問題可能是訂單沒有系統設計造成的,訂單的應該是包含訂單類型,用戶的基本信息的,這樣便于查詢(據說目前項目的訂單id沒有這樣的功能,但是訂單編號是有的,不知道為什么要做兩個唯一標示)。
10,GCD同步異步是相對函數而言,串行還是并發是對隊列而言的,異步有在調用線程之外開新線程的能力,如果同步只能在調用線程或主線程中。主線程中調用在主隊列中調用同步gcd函數,會形成死鎖。但子線程中調用主隊列的同步函數不會。具體見:https://github.com/leixiang1986/DailyExercise.git.
11,- (void)setSelected:(BOOL)selected animated:(BOOL)animated;在初始化或刷新(滑動),會默認調用一遍,selected為NO,點擊的才會設置selected為YES。外部可以通過[self.tableView selectRowAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0] animated:NO scrollPosition:(UITableViewScrollPositionNone)];方法來選中。不用設置model的select屬性來傳遞狀態.
12,控制器A present控制器帶有導航控制器的B,在不論是A,B, B.navigationController 都能dismiss掉B。并且B的parentController是B的導航控制器,B的導航控制器的ParentController為nil。
13,gcd柵欄函數只能用于自定義的并發多列,全局并發隊列無效!
14,如果Could not insert new outlet connection: 可能是類名不一致,也可能是修改了類名,雖然與xib類一致還是報錯,可以刪除 /Users/leixiang/Library/Developer/Xcode/DerivedData/?
15,有些時候用靜態變量比用枚舉更合適,例如,我的界面店主登錄時情況有A1,A2,A3,A4四個cell。在店員登錄時只有A3,A4兩個cell,如果用枚舉,判斷點擊事件時,index就要根據不同情況,進行判斷,如果在cell A3時是消息,需要顯示消息數量,在獲取cell時也要判斷登錄者的身份,定死index是2,還是0。但是如果是字符串的常量,那么點擊事件時,判斷數據源數組的title是否與常量(a1)匹配。設置消息的數量,獲取cell的index時,可以通過數據源的objectAtIndex方法,判斷出消息cell(a3)的index是0還是3,不用因為業務條件的改變發生數據錯亂.?