iOS开发Tips

介绍

随着开发的进行,用到的一些小技巧和插件工具也越来越多。在这里统一的总结一下,方便查阅,时时更新。

小技巧
  • 一个 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插件 - 见图)


Postman
注释

几种常用的注释样式:

@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
   }
}
持续更新...
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,547评论 6 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,399评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,428评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,599评论 1 274
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,612评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,577评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,941评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,603评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,852评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,605评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,693评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,375评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,955评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,936评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,172评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,970评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,414评论 2 342

推荐阅读更多精彩内容