iOS编码规范及常见问题

3,442 阅读4分钟

「这是我参与2022首次更文挑战的第13天,活动详情查看:2022首次更文挑战」。

引言

编码风格Apple官方文档:

The Objective-C Programming Language :

developer.apple.com/library/mac…

Cocoa Fundamentals Guide :

developer.apple.com/legacy/libr…

Coding Guidelines for Cocoa :

developer.apple.com/library/mac…

iOS App Programming Guide:

developer.apple.com/library/ios…

苹果此前宣布,从2022年1月底开始,允许创建账号的App还必须允许用户从App中删除账号。苹果表示,它正在给App发布者和开发者更多的时间,因为它认识到提供此功能的复杂性。

苹果要求App必须内置账号删除功能,但可以宽限一段时间。苹果公司推迟了一些原定于1月31日生效的规则的执行,即App必须提供内置的账户删除功能。

I、Objective-C编码规范

1.1 代码组织

在函数分组和protocol/delegate实现中使用#pragma mark -来分类方法

在这里插入图片描述 在这里插入图片描述

1.2 注释

当需要注释时,注释应该用来解释这段特殊代码为什么要这样做。

任何被使用的注释都必须保持最新或被删除。

1.3 命名

  • 方法和变量命名: Apple命名规则尽可能坚持,长的,描述性的方法和变量命名
UIButton *settingsButton; 

  • 常量:应该使用驼峰式命名规则,所有的单词首字母大写和加上与类名有关的前缀。
static NSTimeInterval const RWTTutorialViewControllerNavigationFadeAnimationDuration = 0.3;  
// 使用字符串常量来代替宏的使用
//定义const 全局常量  ,保证只在一处定义,多处进行引用
////#define HWClientId @""//宏会在编译时,将所有引用宏变量的地方,进行值的替换,造成很多相同的临时字面量,浪费内存
//NSString * const HWClientId = @"";// 全局的const常量代替宏常量,节省内存空间。内存只有一份

  • 属性:属性也是使用驼峰式,但首单词的首字母小写。

对属性使用auto-synthesis( 自动合成),而不是手动编写@synthesize语句,除非特殊需要

@property (strong, nonatomic) NSString *descriptiveVariableName; 

  • 局部变量不应该包含下划线。(为了和实例变量进行区别)

  • 点语法应该总是被用来访问和修改属性

    self.isfooterRereshing = NO;

  • 所有属性特性应该显式地列出来,有助于阅读代码。

属性特性的顺序是storage、atomicity,与Interface Builder连接UI元素时自动生成代码一致。

@interface KNTutorial : NSObject 

 @property (strong, nonatomic) NSString *tutorialName;//所有属性特性应该显式地列出来,有助于阅读代码。属性特性的顺序是storage、atomicity,与Interface Builder连接UI元素时自动生成代码一致。

 @end


  • NSString应该使用copy而不是strong的属性特性。

因为即使在你你声明一个NSString的属性的时候,有人可能传入一个NSMutableString的实例,然后在你没有注意的情况下修改它。

1.4 不允许直接修改对象的结构体属性的成员;

OC中,不予许直接修改“对象”(iconButton)的“结构体属性”(frame)的“成员”(origin);但是允许修改结构体属性的成员

- (void)setY:(CGFloat)y{
    CGRect frame = self.frame;
    frame.origin.y = y;//允许修改结构体属性的成员
    self.frame = frame;
}

1.5 使用CGGeometry操作frame

在这里插入图片描述

1.6 布尔值

  • Objective-C使用YES和NO。

因为true和false应该只在CoreFoundation,C或C++代码使用。

  • 既然nil解析成NO,所以没有必要在条件语句比较。 不要拿某样东西直接与YES比较,因为YES被定义为1

II 性能相关

2.1 全局的const常量代替宏常量,节省内存空间。

  • 使用字符串常量来代替宏的使用

1、定义const 全局常量 ,保证只在一处定义,多处进行引用 2、全局的const常量代替宏常量,节省内存空间。内存只有一份



#define KNClientId @""//宏会在编译时,将所有引用宏变量的地方,进行值的替换,造成很多相同的临时字面量,浪费内存
NSString * const KNClientId = @"";// 全局的const常量代替宏常量,节省内存空间。内存只有一份

2.2 深入理解MRC和ARC内存管理机制

  1. 需要释放的资源:imageCache、queue、operations、view、通知监听者的移除、销毁soundID
  2. 释放的方法:dealloc 、applicationDidReceiveMemoryWarning、didReceiveMemoryWarning
  3. 凡是函数名中带有create、copy、new、retain等字眼的,都应该在不需要它的时候进行release。 GCD的数据类型在ARC环境下不需要进行release;而CF的数据类型在ARC、MRC环境下都需要做release的。

2.2

III 常见问题

3.1 Cocoa naming

Property follows Cocoa naming convention for returning 'owned' objects

不能以new 关键字开头定义属性 在这里插入图片描述

正确的属性定义

由于篇幅原因,更多内容请关注 #小程序:iOS逆向,只为你呈现有价值的信息,专注于移动端技术研究领域;更多服务和咨询请关注#公众号:iOS逆向。