美文网首页
iRIS-iOS代码规范

iRIS-iOS代码规范

作者: Felix的笔头 | 来源:发表于2018-05-11 16:35 被阅读0次

1:类名

1.1:保证NSString在赋值时被复制

【推荐】NSString,在它被传递或者赋值时应当保证是一复制(copy)的方式进行的,这样可以防止在不知情的情况下NSString的值被其他对象修改。

- (void)setFoo:(NSString *)aFoo {
  _foo = [aFoo copy];
}

@property (nonatomic, copy) NSString *aString;

1.2:方法名、参数名、成员变量、局部变量

【强制】参数名、局部变量都统一使用lowerCamelCase。尽量是英文语法表达,避免使用汉语拼音来命名,严禁使用拼音与英文混合的命名方式。

//正例:
endKeyboardRect / certNoView 

//反例: 
EndKeyboardRect / shenFenZhengView

1.3:方法名

【强制】应该在方法类型(-/+ 符号)之后有一个空格。在方法各个段之间应该也有一个空格。在参数之前应该包含一个具有描述性的关键字来描述参数,方法名统一使用lowerCamelCase。

//正例: 
- (void)keyboardWasShown:(NSNotification*)notification;

//反例: 
-(void)keyboardWasShown:(NSNotification*)notification; //[方法类型之后未空格]

1.4:设计模式命名

【推荐】如果使用到了设计模式,建议在类名中体现出具体模式。
说明:将设计模式体现在名字中,有利于阅读者快速理解架构设计思想。

//正例:
@interface AIFApiProxy : NSObject

@interface AIFServiceFactory : NSObject

2. 常量,字面量,枚举定义

2.1:常量是容易重复被使用和无需通过查找和代替就能快速修改值。常量应该使用static来声明而不是使用#define,除非显式地使用宏。

//正例:
static NSString * const RWTAboutViewControllerCompanyName = @"RayWenderlich.com";   

//反例:
#define CompanyName @"RayWenderlich.com"  

2.2: NSString、NSDictionary、NSArray和NSNumber的字面值应该在创建这些类的不可变实例时被使用。请特别注意nil值不能传入NSArray和NSDictionary字面值,因为这样会导致crash。

//正例:
NSArray *names = @[@"Brian", @"Matt", @"Chris", @"Alex", @"Steve", @"Paul"];   
NSDictionary *productManagers = @{@"iPhone": @"Kate", @"iPad": @"Kamal", @"Mobile Web": @"Bill"};  

//反例:
NSArray *names = [NSArray arrayWithObjects:@"Brian", @"Matt", @"Chris", @"Alex", @"Steve", @"Paul", nil]; 

2.3:当使用enum时,推荐使用新的固定基本类型规格,因为它有更强的类型检查和代码补全。现在SDK有一个宏NS_ENUM()来帮助和鼓励你使用固定的基本类型。

//正例:
typedef NS_ENUM(NSInteger, RWTLeftMenuTopItemType)  {       
RWTLeftMenuTopItemMain,       
RWTLeftMenuTopItemShows,      
RWTLeftMenuTopItemSchedule   
}; 

//反例:
enum GlobalConstants  {       
kMaxPinSize = 5,       
kMaxPinCount = 500,   
};

2.4:import 根框架(root frameworks),而非各单个文件

▪ 虽然有时我们仅需要框架(如Cocoa 或 Foundation)的某几个头文件,但引入根文件,编译器会运行的更快。因为根框架(root frameworks)一般会预编译,所以加载会更快。再次强
调:使用 #import 而非 #include 来引入Objective-C框架。如

#import <Foundation/Foundation.h> // 正例

#import <Foundation/NSArray.h> // 反例
#import <Foundation/NSString.h> 
... 

2.5:使用dispatch_once来执行只需运行一次的线程安全的代码

【强制】通过GCD提供的 dispatch_once函数可以简化代码,并保证线程安全。

+ (DataShareManager *)sharedInstance   {  
    static DataShareManager  *sharedManager = nil;  
    static dispatch_once_t onceToken;  
    dispatch_once(&onceToken, ^{  
        sharedManager = [[DataShareManager  alloc] init];  
    });  
    return sharedManager;  
} 

2.6:Objective-C使用YES和NO

【推荐】因为true和false应该只在CoreFoundation,C或C++代码使用。既然nil解析成NO,所以没有必要在条件语句比较。不要拿某样东西直接与YES比较,因为YES被定义为1和一个BOOL能被设置为8位。

//正例:
if (someObject) {}  
if (![anotherObject boolValue]) {}  

//反例:
if (someObject == nil) {}  
if ([anotherObject boolValue] == NO) {}  
if (isAwesome == YES) {} // Never do this.  
if (isAwesome == true) {} // Never do this. 

其他

3.1 不要使用new方法

【强制】尽管很多时候能用new代替alloc init方法,但这可能会导致调试内存时出现不可预料的问题。Cocoa的规范就是使用alloc init方法,使用new会让一些读者困惑。

3.2 #import 和 #include

【强制】
当引用的是一个Objective-C或者Objective-C++的头文件时,使用#import
当引用的是一个C或者C++的头文件时,使用#include,这时必须要保证被引用的文件提供了保护域(#define guard)

1:类名

1.1:保证NSString在赋值时被复制

【推荐】NSString,在它被传递或者赋值时应当保证是一复制(copy)的方式进行的,这样可以防止在不知情的情况下NSString的值被其他对象修改。

- (void)setFoo:(NSString *)aFoo {
  _foo = [aFoo copy];
}

@property (nonatomic, copy) NSString *aString;

1.2:方法名、参数名、成员变量、局部变量

【强制】参数名、局部变量都统一使用lowerCamelCase。尽量是英文语法表达,避免使用汉语拼音来命名,严禁使用拼音与英文混合的命名方式。

//正例:
endKeyboardRect / certNoView 

//反例: 
EndKeyboardRect / shenFenZhengView

1.3:方法名

【强制】应该在方法类型(-/+ 符号)之后有一个空格。在方法各个段之间应该也有一个空格。在参数之前应该包含一个具有描述性的关键字来描述参数,方法名统一使用lowerCamelCase。

//正例: 
- (void)keyboardWasShown:(NSNotification*)notification;

//反例: 
-(void)keyboardWasShown:(NSNotification*)notification; //[方法类型之后未空格]

1.4:设计模式命名

【推荐】如果使用到了设计模式,建议在类名中体现出具体模式。
说明:将设计模式体现在名字中,有利于阅读者快速理解架构设计思想。

//正例:
@interface AIFApiProxy : NSObject

@interface AIFServiceFactory : NSObject

2. 常量,字面量,枚举定义

2.1:常量是容易重复被使用和无需通过查找和代替就能快速修改值。常量应该使用static来声明而不是使用#define,除非显式地使用宏。

//正例:
static NSString * const RWTAboutViewControllerCompanyName = @"RayWenderlich.com";   

//反例:
#define CompanyName @"RayWenderlich.com"  

2.2: NSString、NSDictionary、NSArray和NSNumber的字面值应该在创建这些类的不可变实例时被使用。请特别注意nil值不能传入NSArray和NSDictionary字面值,因为这样会导致crash。

//正例:
NSArray *names = @[@"Brian", @"Matt", @"Chris", @"Alex", @"Steve", @"Paul"];   
NSDictionary *productManagers = @{@"iPhone": @"Kate", @"iPad": @"Kamal", @"Mobile Web": @"Bill"};  

//反例:
NSArray *names = [NSArray arrayWithObjects:@"Brian", @"Matt", @"Chris", @"Alex", @"Steve", @"Paul", nil]; 

2.3:当使用enum时,推荐使用新的固定基本类型规格,因为它有更强的类型检查和代码补全。现在SDK有一个宏NS_ENUM()来帮助和鼓励你使用固定的基本类型。

//正例:
typedef NS_ENUM(NSInteger, RWTLeftMenuTopItemType)  {       
RWTLeftMenuTopItemMain,       
RWTLeftMenuTopItemShows,      
RWTLeftMenuTopItemSchedule   
}; 

//反例:
enum GlobalConstants  {       
kMaxPinSize = 5,       
kMaxPinCount = 500,   
};

2.4:import 根框架(root frameworks),而非各单个文件

▪ 虽然有时我们仅需要框架(如Cocoa 或 Foundation)的某几个头文件,但引入根文件,编译器会运行的更快。因为根框架(root frameworks)一般会预编译,所以加载会更快。再次强
调:使用 #import 而非 #include 来引入Objective-C框架。如

#import <Foundation/Foundation.h> // 正例

#import <Foundation/NSArray.h> // 反例
#import <Foundation/NSString.h> 
... 

2.5:使用dispatch_once来执行只需运行一次的线程安全的代码

【强制】通过GCD提供的 dispatch_once函数可以简化代码,并保证线程安全。

+ (DataShareManager *)sharedInstance   {  
    static DataShareManager  *sharedManager = nil;  
    static dispatch_once_t onceToken;  
    dispatch_once(&onceToken, ^{  
        sharedManager = [[DataShareManager  alloc] init];  
    });  
    return sharedManager;  
} 

2.6:Objective-C使用YES和NO

【推荐】因为true和false应该只在CoreFoundation,C或C++代码使用。既然nil解析成NO,所以没有必要在条件语句比较。不要拿某样东西直接与YES比较,因为YES被定义为1和一个BOOL能被设置为8位。

//正例:
if (someObject) {}  
if (![anotherObject boolValue]) {}  

//反例:
if (someObject == nil) {}  
if ([anotherObject boolValue] == NO) {}  
if (isAwesome == YES) {} // Never do this.  
if (isAwesome == true) {} // Never do this. 

其他

3.1 不要使用new方法

【强制】尽管很多时候能用new代替alloc init方法,但这可能会导致调试内存时出现不可预料的问题。Cocoa的规范就是使用alloc init方法,使用new会让一些读者困惑。

3.2 #import 和 #include

【强制】
当引用的是一个Objective-C或者Objective-C++的头文件时,使用#import
当引用的是一个C或者C++的头文件时,使用#include,这时必须要保证被引用的文件提供了保护域(#define guard)

相关文章

  • iRIS-iOS代码规范

    1:类名 1.1:保证NSString在赋值时被复制 【推荐】NSString,在它被传递或者赋值时应当保证是一复...

  • iRIS-iOS命名规范

    一、命名规范 1、统一要求 含义清楚,尽量做到不需要注释也能了解其作用,若做不到,就加注释,使用全称,不使用缩写。...

  • Web 端代码规范

    目录 1、代码规范概述 2、代码规范流程搭建 3、代码规范细则 1、代码规范概述 良好的代码规范能够提供软件的可读...

  • 代码规范

    代码规范 1. 概述 欢迎使用前端代码规范, 这里借鉴、引用的是京东前端代码规范。 遵循代码规范的目的在于增强团队...

  • iOS 代码规范篇

    iOS 代码规范篇 iOS 代码规范篇

  • iOS(OC)开发之随感

    1.代码规范 规范很重要!规范很重要!规范很重要! 代码规范的重要性之-为什么谷歌要执行严格的代码编写规范http...

  • 前端学习的基本总结

    目录 1.为什要遵守代码规范 2.css代码规范 3.js代码规范与设计模式3.1 js代码规范3.2 设计模式 ...

  • 乐乎项目优化

    编程: 1、代码规范。架构规范、文件组织规范、命名规范、代码逻辑规范、资源存放。 一、使用cocoapod 二、代...

  • 小肤iOS开发代码规范_v1.0

    For Objective-C , 2018.8.2 Ⅰ.前言Ⅱ.命名规范Ⅲ.代码注释规范Ⅳ.代码格式化规范Ⅴ....

  • 代码规范

    代码规范 1. 概述 欢迎使用代码规范, 这个是我借鉴京东前端代码规范,组织的内部规范。旨在增强团队开发协作、提高...

网友评论

      本文标题:iRIS-iOS代码规范

      本文链接:https://www.haomeiwen.com/subject/ivuirftx.html