您的位置:首页 > 移动开发 > IOS开发

OC的一些风格注意点

2015-12-28 16:50 302 查看
1.条件语句

<span style="font-size:14px;">推荐:

if (!error) {
return success;
}
不推荐:

if (!error)
return success;


if (!error) return success;</span>

2.nil和BOOL检查

推荐使用:
if (nil == myValue) { ...


为了避免这些奇怪的问题,可以用感叹号来作为运算符。因为 nil 是 解释到 NO,所以没必要在条件语句里面把它和其他值比较。同时,不要直接把它和 
YES
 比较,因为 
YES
 的定义是
1, 而 
BOOL
 是 8 bit的,实际上是 char 类型。

推荐:

if (someObject) { ...
if (![someObject boolValue]) { ...
if (!someObject) { ...


不推荐:

if (someObject == YES) { ... // Wrong
if (myRawValue == YES) { ... // Never do this.
if ([someObject boolValue] == NO) { ...


推荐:

- (void)someMethod {
if (![someOther boolValue]) {
return;
}

//Do something important
}


不推荐:

- (void)someMethod {
if ([someOther boolValue]) {
//Do something important
}
}



3.三元运算符

三元运算符 ? 应该只用在它能让代码更加清楚的地方。 一个条件语句的所有的变量应该是已经被求值了的。类似 if 语句,计算多个条件子句通常会让语句更加难以理解。或者可以把它们重构到实例变量里面。

推荐:

result = a > b ? x : y;


不推荐:

result = a > b ? x = c > d ? c : d : y;


当三元运算符的第二个参数(if 分支)返回和条件语句中已经检查的对象一样的对象的时候,下面的表达方式更灵巧:

推荐:

result = object ? : [self createObject];


不推荐:

result = object ? object : [self createObject];


4.case语句
     

除非编译器强制要求,括号在 case 语句里面是不必要的。但是当一个 case 包含了多行语句的时候,需要加上括号。

switch (condition) {
case 1:
// ...
break;
case 2: {
// ...
// Multi-line example using braces
break;
}
case 3:
// ...
break;
default:
// ...
break;
}


有时候可以使用 fall-through 在不同的 case 里面执行同一段代码。一个 fall-through 是指移除 case 语句的 “break” 然后让下面的 case 继续执行。

switch (condition) {
case 1:
case 2:
// code executed for values 1 and 2
break;
default:
// ...
break;
}


当在 switch 语句里面使用一个可枚举的变量的时候,
default
 是不必要的。比如:

switch (menuType) {
case ZOCEnumNone:
// ...
break;
case ZOCEnumValue1:
// ...
break;
case ZOCEnumValue2:
// ...
break;
}


此外,为了避免使用默认的 case,如果新的值加入到 enum,程序员会马上收到一个 warning 通知

Enumeration value 'ZOCEnumValue3' not handled in switch.(枚举类型 'ZOCEnumValue3' 没有被 switch 处理)

5.通用的命名

推荐使用长的、描述性的方法和变量名。

推荐:

UIButton *settingsButton;


不推荐:

UIButton *setBut;


常量

常量应该以驼峰法命名,并以相关类名作为前缀。

推荐:

static const NSTimeInterval ZOCSignInViewControllerFadeOutAnimationDuration = 0.4;


不推荐:

static const NSTimeInterval fadeOutTime = 0.4;


推荐使用常量来代替字符串字面值和数字,这样能够方便复用,而且可以快速修改而不需要查找和替换。常量应该用 
static
声明为静态常量,而不要用 
#define
,除非它明确的作为一个宏来使用。

推荐:

static NSString * const ZOCCacheControllerDidClearCacheNotification = @"ZOCCacheControllerDidClearCacheNotification";
static const CGFloat ZOCImageThumbnailHeight = 50.0f;


不推荐:

#define CompanyName @"Apple Inc."
#define magicNumber 42


常量应该在头文件中以这样的形式暴露给外部:

extern NSString *const ZOCCacheControllerDidClearCacheNotification;


字面值
使用字面值来创建不可变的 
NSString
NSDictionary
NSArray
,
和 
NSNumber
 对象。注意不要将 
nil
 传进 
NSArray
 和 
NSDictionary
 里,因为这样会导致崩溃。

6.关于
pragma

http://raptureinvenice.com/pragmas-arent-just-for-marks有很好的关于
pragma 的讨论了,在这边我们再做部分说明。

大多数 iOS 开发者平时并没有和很多编译器选项打交道。一些选项是对控制严格检查(或者不检查)你的代码或者错误的。有时候,你想要用 pragma 直接产生一个异常,临时打断编译器的行为。

当你使用ARC的时候,编译器帮你插入了内存管理相关的调用。但是这样可能产生一些烦人的事情。比如你使用 
NSSelectorFromString
 来动态地产生一个 selector 调用的时候,ARC不知道这个方法是哪个并且不知道应该用那种内存管理方法,你会被提示 
performSelector
may cause a leak because its selector is unknown(执行 selector 可能导致泄漏,因为这个 selector 是未知的)
.

如果你知道你的代码不会导致内存泄露,你可以通过加入这些代码忽略这些警告

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Warc-performSelector-leaks"

[myObj performSelector:mySelector withObject:name];

#pragma clang diagnostic pop


注意我们是如何在相关代码上下文中用 pragma 停用 -Warc-performSelector-leaks 检查的。这确保我们没有全局禁用。如果全局禁用,可能会导致错误。

全部的选项可以在 The Clang User's Manual 找到并且学习。

忽略没用使用变量的编译警告

告诉你申明的变量它将不会被使用,这种做法很有用。大多数情况下,你希望移除这些引用来(稍微地)提高性能,但是有时候你希望保留它们。为什么?或许它们以后有用,或者有些特性只是暂时移除。无论如何,一个消除这些警告的好方法是用相关语句进行注解,使用 
#pragma unused()
:

- (NSInteger)giveMeFive
{
NSString *foo;
#pragma unused (foo)

return 5;
}


现在你的代码不用任何编译警告了。注意你的 pragma 需要标记到问题代码之下。


明确编译器警告和错误

编译器是一个机器人,它会标记你代码中被 Clang 规则定义为错误的地方。但是,你总是比 Clang 更聪明。通常,你会发现一些讨厌的代码会导致这个问题,但是暂时却解决不了。你可以这样明确一个错误:

- (NSInteger)divide:(NSInteger)dividend by:(NSInteger)divisor
{
#error Whoa, buddy, you need to check for zero here!
return (dividend / divisor);
}


类似的,你可以这样标明一个警告
- (float)divide:(float)dividend by:(float)divisor
{
#warning Dude, don't compare floating point numbers like this!
if (divisor != 0.0) {
return (dividend / divisor);
}
else {
return NAN;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  iOS