ios code style

注释


建议使用VVDocumenter插件

多行注释

格式:


/**

注释内容
*/

单行注释


格式:


///在对文件、类、函数进行注释时推荐使用多行注释,在函数体内对代码块进行注释时,使用单行注释

函数的注释


函数注释的格式为


/**
* @brief
* @param
* @return
**/
在brief中需要写明函数的主要功能、注意事项
在param中需要写明函数的变量类型、变量的作用
在return中需要写明函数的返回类型、返回值的作用
如有其他需要说明的地方,可以在@return后面添加新项。如
/**
* @brief
* @param
* @return
* @warning
**/

/**
* @brief 上传图片。上传成功后会自动将图片放入缓存,缓存的key为图片的url
* @param UIImage,需要上传的图片
* @return void
* @blocks
* success:返回的NSDictionary中包含服务器的response信息,包括图片id(id),url(url),宽度(width),高度(height)。使用括号中的名称从NSDictionary中获取。
* failed:返回error
**/

命名


常量的命名


(如宏、枚举、静态局部变量等)应该以小写字母k开头,使用混合大小写的格式来分隔单词。

函数的命名

函数名应该已小写字母开头,并混合大小写,其中的每个参数都应该是小写字母开头,读起来应该像句子一样,访问器方法应该与他们getting的成员变量的名字一样,但不应该以get作为前缀,如:


  - (id)getDelegate;    //avoid
- (id)delegate; //good

变量的命名

成员变量应该已小写字母开头,并以下划线作为后缀,如usernameTextField_,使用KVO/KVC绑定成员变量时,可以以一个下划线为前缀。

公共变量命名: 小写字母开头。如:imageView;

实例变量命名:

私有变量: 应该以下划线开头。如:_addButton

常量命名: 以小写k开头,混合大小写。如:kInvalidHandle, kWritePerm


图片的命名

应该已“模块+功能+作用+样式”的形式


如:message_private_at_button_bg_normal.png

类的命名

类名、分类名、协议名应该以大写字母开始,并混合小写字母来分隔单词,应该已“模块+功能+子功能”的方式:


如:MessagePrivateAtsomebody

应用级的类,应避免不用前缀,跨应用级的类,应使用前缀, objc 如:GTMSendMessage

分类名

类别名应该有两三个字母作为前缀已表示为某项目的一部分,并且包含所扩展的类的名字,如我们要创建一个NSString的类别以解析,我们将类别放在一个名为GTMNSString+Parsing.h的文件中。类别名本身为GTMStringParsingAdditions(类别名与文件名不同是为了让文件可以包含更多相同功能的扩展)类名与包含类别名之间应一个空格分隔。


如:
//NSString 为要扩展的类名, GTMStringParsingAdditions为类别名
@interface NSString (GTMStringParsingAdditions)
- (NSString *)gtm_foobarString;
@end

@interface FoobarViewController ()
@property(nonatomic, retain) NSView *dongleView;
- (void)performLayout;
@end

注意事项


条件语句


为避免错误,条件语句体必须使用大括号,即便语句体中的语句可以不必使用大括号(比如只有一行语句)。常见的错误包括在不使用大括号的情况下添加第二行语句,以为它属于if语句的一部分。此外,更可怕的事情是,如果条件语句中的代码行被注释,则本不术语条件语句的下一行代码将变成条件语句的一部分。此外,这种编码风格和所有其它条件语句均保持一致。


如:
if (!error) {
return success;
}

变量

变量的命名应尽可能具有自解释性。除了在for()循环语句中,应避免使用单个字母变量名称。
除非是常量,星号应紧贴变量名称表示指向变量的指针, objc 如: NSString *text;

应尽可能使用属性定义替代单一的实例变量。避免在初始化方法,dealloc方法和自定义的setter和getter方法中直接读取实例变量参数(init,initWithCoder:,等等)


如:
@interface NYTSection: NSObject

@property (nonatomic) NSString *headline;

@end

应尽量避免下面的方式:

@interface NYTSection : NSObject {
NSString *headline;
}

下划线


当使用属性变量时,应通过self.来获取和更改实例变量。这就意味着所有的属性将是独特的,因为它们的名称前会加上self。本地变量名称中不应包含下划线


如:
self.imgView.backgroundColor = [UIColor black];

而尽量避免:

_imgView.backgroundColor = [UIColor black];

Immutable实例初始化


在创建NSString,NSDictionary,NSArray和NSNumber等对象的immutable实例时,应使用字面量。需要注意的是,不应将nil传递给NSArray和NSDictionary字面量,否则会引起程序崩溃。所以在存入数据到NSArray和NSDictionary时也要判断一下数据是否是nil。


NSArray *names = @[@"Brian", @"Matt", @"Chris", @"Alex", @"Steve", @"Paul"];
NSDictionary *productManagers = @{@"iPhone" : @"Kate", @"iPad" : @"Kamal", @"Mobile Web" : @"Bill"};
NSNumber *shouldUseLiterals = @YES;
NSNumber *buildingZIPCode = @10018;

不恰当:
NSArray *names = [NSArray arrayWithObjects:@"Brian", @"Matt", @"Chris", @"Alex", @"Steve", @"Paul", nil];
NSDictionary *productManagers = [NSDictionary dictionaryWithObjectsAndKeys: @"Kate", @"iPhone", @"Kamal", @"iPad", @"Bill", @"Mobile Web", nil];
NSNumber *shouldUseLiterals = [NSNumber numberWithBool:YES];
NSNumber *ZIPCode = [NSNumber numberWithInteger:10018];

类型


最好用NSInteger和NSUInteger而不是用int,long。其他的float同理。

CGRect函数

当需要获取一个CGRect矩形的x,y,width,height属性时,应使用CGGeometry函数,而非直接访问结构体成员。


如:
CGRect frame = self.view.frame;

CGFloat x = CGRectGetMinX(frame);
CGFloat y = CGRectGetMinY(frame);
CGFloat width = CGRectGetWidth(frame);
CGFloat height = CGRectGetHeight(frame);

不恰当:
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;

常量


相对字符串字面量或数字,我们更推荐适用常量。应使用static方式声明常量,而非使用#define的方式来定义宏。

?





1

2

3

4

5

6

7

例如:

static
NSString * const
NYTAboutViewControllerCompanyName = @"The New York Times Company"

static
const CGFloat NYTImageThumbnailHeight = 50.0;

不恰当:

//#define CompanyName @"The New York Times Company"

//#define thumbnailHeight 2

枚举类型

在使用enum的时候,推荐适用最新的fixed underlying type(WWDC 2012 session 405- Modern
Objective-C)规范,因为它具备更强的类型检查和代码完成功能。


如:
typedef NS_ENUM(NSInteger, NYTAdRequestState) {
NYTAdRequestStateInactive,
NYTAdRequestStateLoading
};

布尔变量

因为nil将被解析为NO,因此没有必要在条件语句中进行比较。永远不要将任何东西和YES进行直接比较,因为YES被定义为1,而一个BOOL变量可以有8个字节。


如:
if (!someObject) {
}

if (isAwesome)

if (![someObject boolValue])

不恰当:
if (someObject == nil) {
}

if ([someObject boolValue] == NO)

if (isAwesome == YES) // Never do this.

如果一个BOOL属性使用形容词来表达,属性将忽略’is’前缀,但会强调惯用名称。 例如:


@property (assign, getter=isEditable) BOOL editable;

单例

在创建单例对象的共享实例时,应使用线程安全模式。


如:
(instancetype)sharedInstance {
static id sharedInstance = nil;

static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedInstance = [[self alloc] init];
});

return sharedInstance;
}

数字


尽量避免数字固定为某个类型如:写5而不写5.0,5.3而不写5.3f)

代码组织

用 #pragma
mark
来将方法分类,这个非常有效,当你用快捷键Control+6可以高效的寻找到自己想要跳转到的方法


//#pragma mark Properties

@dynamic someProperty;

- (void)setCustomProperty:(id)value {}

#pragma mark Lifecycle

+ (id)objectWithThing:(id)thing {}
- (id)init {}

#pragma mark Drawing

#pragma mark UItableView delegate

#pragma mark UITableView datasource

- (void)drawRect:(CGRect) {}

#pragma mark Another functional grouping

#pragma mark GHSuperclass

- (void)someOverriddenMethod {}

#pragma mark NSCopying

- (id)copyWithZone:(NSZone *)zone {}

#pragma mark NSObject

- (NSString *)description {}

判断语句


if和else应该和左大括号在同一行


如:
if (button.enabled) {
// Stuff
} else if (otherButton.enabled) {
// Other stuff
} else {
// More stuf
}

Switch 也是一样


如:
switch (something.state) {
case 0: {
// Something
break;
}

case 1: {
// Something
break;
}

case 2:
case 3: {
// Something
break;
}

default: {
// Something
break;
}
}

git commit 格式

可以参考google开源项目的Commit
规范

参考规范:

  1. 添加了新功能 feat(大模块+子模块):#例如实现了某个具体功能

  2. 修改了某些功能 change(大模块+子模块):#例如修改了某个具体的功能

  3. 修复了某个Bug fix_bug(大模块+子模块):#修复了什么的bug,最好写上*原因*和*解决方法*。

  4. 比较大的改动 ``` broken_change(): before:

    after: ```


  5. 修改了文档 docs():

  6. 修改了格式 style():

  7. 添加了一些测试 test(大模块+子模块):

  8. 一些杂项,比如像解决工程编译错误等问题之后的修改 chore():

  9. 对又有代码的重构 refactor(大模块+子模块):

格式

一行代码的长度不能超过80个字母

函数声明和定义:

“-”或“+”和返回类型之间应该有一个空格


如:
- (void)doSomethingWithString:(NSString *)theString {
...
}

方法大括号和其它大括号(比如if/else/switch/while等等)应在语句的同一行开始,而在新的一行关闭。


if (user.isHappy) {
//Do something
}
else {
//Do something else
}

当有多个参数的时,如果参数太多超过一行,则应该将每个参数分行,并且冒号对齐


如:
- (void)doSomethingWith:(GTMFoo *)theFoo
rect:(NSRect)theRect
interval:(float)theInterval {
...
}

当第一个参数短于其他参数的时候,分行时每行至少要缩进4个空格


             longKeyword:(NSRect)theRect
evenLongerKeyword:(float)theInterval
error:(NSError **)theError {
...
}

方法调用

方法调用应该和方法声明的时候一个格式,要么所有参数放在一行里:


[myObject doFooWith:arg1 name:arg2 error:arg3];

要么每一行一个参数:


如:
[myObject doFooWith:arg1
name:arg2
error:arg3];

当第一个参数短语其他参数的时候,分行是每行至少要缩进4个空格:


如:
[myObj short:arg1
longKeyword:arg2
evenLongerKeyword:arg3
error:arg4];

@public 和 @private前面为一个空格


如:
@interface MyClass : NSObject{
@public

@private
}
@end

协议

类型与协议名之间不要空格


如:
@interface MyProtocoledClass : NsObject<NSWindowDelegate> {
@private
id<MyFancyDelegate> _delegate;
}
- (void)setDelegate:(id<MyFancyDelegate>)aDelegate;
@end

Blocks


在一行的情况
如:
[operation setCompletionBlock:^{ [self onOperationDone]; }];

//block 在新的行里,需要缩进四个空格
[operation setCompletionBlock:^{
[self.delegate newDataAvailable];
}];

dispatch_async(_fileIOQueue, ^{
NSString* path = [self sessionFilePath];
if (path) {
// ...
}
});


//有参数的block,|(SessionWindow *window)|与|{|之间有一个空格
如:
[[SessionService sharedService]
loadWindowWithCompletionBlock:^(SessionWindow *window) {
if (window) {
[self windowDidLoad:window];
} else {
[self errorLoadingWindow];
}
}];

//block 中有参数且不能在一行中显示
//要行与行之间要相对有四个空格
[[SessionService sharedService]
loadWindowWithCompletionBlock:
^(SessionWindow *window) {
if (window) {
[self windowDidLoad:window];
} else {
[self errorLoadingWindow];
}
}];

//很长的block可以被定义不在一行里
void (^largeBlock)(void) = ^{
// ...
};
[_operationQueue addOperationWithBlock:largeBlock];

ios code style,布布扣,bubuko.com

时间: 2024-10-11 20:53:23

ios code style的相关文章

iOS Code Sign error: Provisioning profile can&#39;t be found 解决方案

出现error的过程:在运行另外一个xcode项目重置了code sign,回到原来的项目的时候出现这个error 修复方法: targe-build settings-code signing identity-choose iOS Developer 然后Provision File选择对应的file 参考链接: https://developer.apple.com/legacy/library/documentation/ToolsLanguages/Conceptual/YourFir

VS2015--win32工程配置的一些想法之Google Code Style中头文件的顺序

工程大了,有很多的头文件,也要引用很多的库文件. 从我们学习C++写hello world的那一刻起,就知道要包含一些系统文件. 那么顺序如何呢? 在review的时候,感觉自己写的东西就是一坨屎. 看看Google code style中是如何描述include文件顺序的: Names and Order of Includes Use standard order for readability and to avoid hidden dependencies: C library, C++

iOS 代码审查:宽松的指导方针(iOS Code Review: Loose Guidelines)

iOS 代码审查:宽松的指导方针 (iOS Code Review: Loose Guidelines) Jack Nutting February 19, 2014 IOS + From time to time I've been asked to do an independent code review, to determine the overall health of a client's code base. Unlike a code walkthrough, where so

(译)iOS Code Signing: 解惑

子龙山人 Learning,Sharing,Improving! (译)iOS Code Signing: 解惑 免责申明(必读!):本博客提供的所有教程的翻译原稿均来自于互联网,仅供学习交流之用,切勿进行商业传播.同时,转载时不要移除本申明.如产生任何纠纷,均与本博客所有人.发表该翻译稿之人无任何关系.谢谢合作! 原文链接地址:http://www.raywenderlich.com/2915/ios-code-signing-under-the-hood 注:本文由翻译团队成员skingTr

idea google code style

1.https://github.com/google/styleguide 下载google code style风格配置xml 2.自己操作系统所属目录\.IntelliJIdea15\config\codestyles\  没有codestyles文件目录的自己创建一个把  intellij-java-google-style.xml 考进去 3.启动idea,全局setting中editor-code style-scheme选择googleStyle ps:自己用什么语言到时候用对应的

iOS Code Sign error: Provisioning profile can&amp;#39;t be found 解决方式

出现error的过程:在执行另外一个xcode项目重置了code sign.回到原来的项目的时候出现这个error 修复方法: targe-build settings-code signing identity-choose iOS Developer 然后Provision File选择相应的file 參考链接: https://developer.apple.com/legacy/library/documentation/ToolsLanguages/Conceptual/YourFir

[code style]javascript style

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 var globalVariable=null; var globalObject={     init:function(){         $.extend({method:function(e){e}});    //jquery static method extend         $.fn.extend(); //jquery instance method extend  

IDEA学习系列之剖析IDEA里的Code Style(适合各种语言)(不断更新)(图文详解)

不多说,直接上干货! File  -> Settings ->  Editor  ->   Code Style   (1)HOCON 分为: Tabs  and Indents . Spaces . Wrapping and Braces 和  Blank Lines (2)Scala 分为:Tabs and Indents.Spaces.Wrapping and Braces.Blank Lines.ScalaDoc.Imports.Multi-line strings.Type A

Code Style for OI

Code Style for OI #include #define 尽量少用 #include 能#include <foo>就不#include "foo" #if,#endif等预编译指令 尽量别用,用的话给出与之对应的指令 using 不使用using namespace foo,如有需要应使用using foo::bar 对于using foo = bar;不限制 缩进 4格缩进 大括号 大括号不换行才是最优雅的!大括号换行的都是异端! 大括号换行 空格 能用就用