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.jianshu.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,不用因为业务条件的改变发生数据错乱.