介绍
随着开发的进行,用到的一些小技巧和插件工具也越来越多。在这里统一的总结一下,方便查阅,时时更新。
小技巧
- 一个 GCC 非常模糊的特性,以及 Clang 也有的特性是,代码块如果在闭合的圆括号内的话,会返回最后语句的值。
NSURL *url = ({
NSString *urlString = [NSString stringWithFormat:@"%@/%@", baseURLString, endpoint];
[NSURL URLWithString:urlString];
});
这个特性非常适合组织小块的代码,通常是设置一个类。给出一个重要的入口并且减少相关干扰,能让代码聚焦于关键的变量和函数中。此外,这个方法有一个优点,所有的变量都在代码块中,也就是只在代码块的区域中有效,这意味着可以减少对其他作用域的命名污染。
- 在 Block 内如果需要访问 self 的方法、变量,建议使用 weakSelf。
如果在 Block 内需要多次 访问 self,则需要使用 strongSelf。
__weak __typeof__(self) weakSelf = self;
dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{
__strong __typeof(self) strongSelf = weakSelf;
if (strongSelf) {
[strongSelf doSomething];
[strongSelf doSomethingElse];
} else {
// Probably nothing... return;
}
});
在 doSomething 中,weakSelf 不会变成 nil,不过在 doSomething 执行完成,调用第二个方法 doOtherThing 的时候,weakSelf 有可能被释放。即在没有循环引用的时候,block 是否被 retain 或者是一个属性都没关系。如果 block 被传递或者 copy 了,在执行的时候,weakSelf 可能会变成 nil。于是,strongSelf 就派上用场了,而__strong确保在 Block 内,strongSelf 不会被释放。
Xcode插件
1.ColorSense for Xcode - 用UIColor或者 NSColor的方法会弹出色盘和颜色角标,赞!
2.Peckham - 能十分方便的在代码中引入头文件,支持模糊搜索,快捷键control+command+p。
3.SCXcodeMinimap - 可以再代码侧面添加一个小地图,方便搜索的时候快速定位,快捷键control+shift+m。
4.XToDo - 快速添加todo list(view ->snippets),且能精确查找todo,快捷键control+t。
5.VVDocumenter - 快速注释,快捷键///。
6.KSImageNamed - 自动在 imageNamed:方法后面列出项目里所有的文件名,带缩略图。
7.HOStringSense - 格式化字符串,方便好用。
8.FuzzyAutocompletePlugin - 方法名模糊匹配,提高效率的好工具。
9.ClangFormat-Xcode - 一键格式化代码。
几种处理JSON的工具or网站
JSON校验
JSON格式化工具
json editor online
图片压缩
tinypng - 无损压缩,高效好用。
调试接口
Postman(chrome插件 - 见图)
注释
几种常用的注释样式:
@property (nonatomic ,strong) RHBankCard *bankCard;/**<银行卡信息*/
@property (nonatomic ,strong) RHBankCard *bankCard;///<银行卡信息
/**银行卡信息*/
@property (nonatomic ,strong) RHBankCard *bankCard;
typedef enum
{
ShareTypeSinaWeibo = 1, /**< 新浪微博 */
ShareTypeTencentWeibo = 2, /**< 腾讯微博 */
ShareTypeDouBan = 5, /**< 豆瓣社区 */
ShareTypeQQSpace = 6, /**< QQ空间 */
}
ShareType;
/**
* initWithStyle
*
* @param style style description
* @param reuseIdentifier reuseIdentifier description
*
* @return self
*/
- (id)initWithStyle:(UITableViewCellStyle)style reuseIdentifier:(NSString *)reuseIdentifier;
前两种注释方式可以自由选择,让代码更美观。第三种是用在enum类型,第四种用的是喵神的VVDocumenter插件,适用于param多的方法。
正确地定义常量
以前定义常量都是用的#define,很简单也方便,从没想过可能出现的问题。一般这么定义:
#define ANIMATION_DURATION_SHORT 0.3
#define ANIMATION_DURATION_MIDDLE 0.6
#define ANIMATION_DURATION_LONG 1.0
这段代码是不是看起来很熟悉,在开发中也会经常用到。那么问题来了,宏定义只是简单地替换,即将一切宏定义替换成定义后面的内容,所以
- 宏定义不会检查替换的“类型”,只要遇到,就做替换。
- 宏定义不保证“不可变”,因为可以重复定义,不能保证值不变。
所以,恰当的常量应该具备合适的名字、正确的类型,还有const、extern等关键字的修饰。例:
//动画时间长度常量
static const NSTimeInterval kAnimationDurationLong = 1.0f;
首先加static,限定在本文件中使用,确保不与其他的常量冲突,其次加const确保常量不被改变。若要定义一个全局变量,则在.h文件中用extern声明,在.m中定义,这样:
//.h
extern NSString * const PDUserInfoNotification;
//.m
NSString * const PDUserInfoNotification = @"PDUserInfoNotification";
关于这点,更详细的可以看这里。
CGRect函数
当访问CGRect里的x, y, width, 或 height时,应该使用CGGeometry函数而不是直接通过结构体来访问。引用Apple的CGGeometry:在这个参考文档中所有的函数,接受CGRect结构体作为输入,在计算它们结果时隐式地标准化这些rectangles。因此,你的应用程序应该避免直接访问和修改保存在CGRect数据结构中的数据。相反,使用这些函数来操纵rectangles和获取它们的特性。
应该:
CGRect frame = self.view.frame;
CGFloat x = CGRectGetMinX(frame);
CGFloat y = CGRectGetMinY(frame);
CGFloat width = CGRectGetWidth(frame);
CGFloat height = CGRectGetHeight(frame);
CGRect frame = CGRectMake(0.0, 0.0, width, height);
不应该:
CGRect frame = self.view.frame;
CGFloat x = frame.origin.x;
CGFloat y = frame.origin.y;
CGFloat width = frame.size.width;
CGFloat height = frame.size.height;
CGRect frame = (CGRect){ .origin = CGPointZero, .size = frame.size };
黄金路径
当使用条件语句编码时,左手边的代码应该是"golden" 或 "happy"路径。也就是不要嵌套if
语句,多个返回语句也是OK。
应该:
- (void)someMethod {
if (![someOther boolValue])
{
return;
}
//Do something important
}
不应该:
- (void)someMethod {
if ([someOther boolValue])
{
//Do something important
}
}