1、$(SRCROOT) // 表示当前文件夹。
2、CGFloat iconFrameY = CGRectGetMaxY(_timeFrame); // 取_timeFrame的Y的最大值。同样CGRectGet可以取到关于frame的其它所有的值。
3、我们经常会根据计算出的文字大小来布局视图,如果你遇到这些字符串,而且没有对-inf进行特殊处理的话,很有可能App就运行异常了。现在App有很多用户自行输入内容,如评论,信息等,这些很容易让一些恶意用户输入并上传这些bug文本,那么你的App就很容易异常了,所以还是有必要进行一些特殊处理的。这些特殊的字符串一般不会由本地App产生,而是用户产生,建议在服务器端处理。本地简单的处理方法就是Trim一下:
string = [string stringByTrimmingCharactersInSet:[NSCharacterSet characterSetWithRange:NSMakeRange(0xAD, 1)]];
全局常量不可使用宏定义
我们经常看到一些用宏定义的通知,关键字等。其实这么做是非常危险的,因为宏很可能被重定义,而且引用不同的文件可能会导致宏的不同,所以尽量使用const来定义常量。
5、dispatch_once
为保证线程安全,所有单例都用dispatch_once生成,保证只执行一次,这也是iOS开发常用的技巧。
6、weak & strong self
常看到一个block要使用self,会处理成在外部声明一个weak变量指向self,在block里又声明一个strong变量指向weakSelf:
__weak __typeof(self)weakSelf = self;
self.backgroundTaskIdentifier = [application beginBackgroundTaskWithExpirationHandler:^{
__strong __typeof(weakSelf)strongSelf = weakSelf;
}];
weakSelf是为了block不持有self,避免循环引用,而再声明一个strongSelf是因为一旦进入block执行,就不允许self在这个执行过程中释放。block执行完后这个strongSelf会自动释放,没有循环引用问题。
需要强调的是千万不要在重写description中打印输出self,因为当输出self时会调用该对象的description方法,如此一来就会造成死循环。
8、当 automaticallyAdjustsScrollViewInsets 为 NO 时,tableview或者scrollview 是从屏幕的最上边开始,即从状态栏开始。
9、在plist里设置):
首先设置key:Status bar is initially hidden 为YES
然后设置key:View controller-based status bar appearance 为NO
即可实现全局隐藏状态栏。
10、NSIndexPath的创建
NSIndexPath *indexPath = [NSIndexPath indexPathForRow:0 inSection:0];
11、Cell刷新
(1)、刷新指定row或rows
[tableView reloadRowsAtIndexPaths:[NSArray arrayWithObjects:selectedIndexPath,nil] withRowAnimation:UITableViewRowAnimationNone];
(2)、刷新某个section内cell
[tableView reloadSections:section withRowAnimation:UITableViewRowAnimationNone];
12、在imageView不变的情况下,让imageView里的图片旋转90°
[UIImage imageWithCGImage:image.CGImageRef scale:1 orientation:UIImageOrientationLeft];
相对于 transform 是作用在UIImageView上的,而这个方法却是直接作用在image上的。
13、cell禁止选中
[cell setSelectionStyle:UITableViewCellSelectionStyleNone];
%.xf 显示小数点后x位
floor(value*100) / 100 // 向下取整后保留两位。
ceil(value*100) / 100 // 四舍五入后取整保留两位。
UINavigationController 一般不需要自己显示的去初始化。UIViewController里面有这个属性了,如果检测不为空,直接用就可以了。
如果你想用pushViewController: animated: 这个方法,就要初始化前面那个nav(原理就是使它是一个栈,你push的时候是往里面push了一个viewController)。
例: VCa.nav --> push VCb
那么在初始化 VCa 时需要 :
UINavigationController *nav = [[UINavigationController alloc] initWithRootViewController:VCa];
// 程序10%的闪退。
exit(0);
}
label.adjustsFontSizeToFitWidth = YES;
[label sizeToFit] 是缩小label的尺寸去适应文本的大小