前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >熟悉OC--4:多用类型常量,少用*define预处理指令

熟悉OC--4:多用类型常量,少用*define预处理指令

作者头像
xy_ss
发布2023-11-22 08:17:29
900
发布2023-11-22 08:17:29
举报
文章被收录于专栏:浮躁的喧嚣

开发场景

编写代码经常需要定义常量,例如,写一个UI动画,需要定义一个动画播放时间,通常做法

代码语言:javascript
复制
#define ANIMATION_DURATION 5

这行预处理指令会把源代码中的ANIMATION_DURATION替换为5,可以实现需求,但是这样写不太好,其原因:

  • 代码中并没有定义出常量的类型信息,duration表示时间,但是代码中,并没有表示出它值得类型
  • 预处理指令会把碰到的所有ANIMATION_DURATION全部替换为5

解决此问题,可以利用编译器的特性,代码如下

代码语言:javascript
复制
static const NSTimeInterval kAnimationDuration = 5;

这样定义的好处

  • 清晰的描述了常量的含义,常量的类型
  • 命名习惯(若仅在该类.m文件中使用,则字母前加k,若在该类外也要使用,则加类名)

常量位置

  • 若不公开某个常量,则将其定义在该类的.m文件
代码语言:javascript
复制
#import "ViewController.h"
static const NSTimeInterval kAnimationDuration = 5;
@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    [self animation];
}
- (void)animation{
    [UIView animateWithDuration:kAnimationDuration animations:^{
    }];
}
@end

注意:变量一定要同时用static与const来声明。 const修饰符所声明的变量,如果修改就会报错 static修饰符则意味着该变量仅在定义此变量的.m文件可见

  • 对外公开某个常量(比如通知名称)
    • 此类常量需要放在“全局符号表”中,这样别的类可以使用
    • 这个常量在.h中声明,在.m中定义
    • 这个常量名字,最好使用与之相关的类名做前缀
代码语言:javascript
复制
#import <UIKit/UIKit.h>

@interface LoginViewController : UIViewController
extern NSString  *const LoginNoti;
@end

#import "LoginViewController.h"

NSString *const LoginNoti = @"login";

@implementation LoginViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter]postNotificationName:LoginNoti object:nil];
}
@end


#import "ViewController.h"
#import "LoginViewController.h"
@implementation ViewController
- (void)viewDidLoad {
    [super viewDidLoad];
    [[NSNotificationCenter defaultCenter]addObserver:self selector:@selector(run) name:LoginNoti object:nil];
}
- (void)run{
    NSLog(@"run");
}
@end

要点

  1. 不要用预处理指令定义常量,因为不含类型信息,而且有人改了常量值也不会报错
  2. 在实现文件里使用static、const来定义的常量只能在该类的.m文件中使用,此类常量不在全局符号中,所以无需加前缀
  3. 在头文件中使用extern来声明全局变量,并在相关实现文件中定义其值,这种常量要出现在全局符号表中,其名称需要加上与之相关的类名

参考

Effective+Objective-C 2.0 编写高质量iOS与OS X代码的52个有效方法

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018-07-21,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 开发场景
  • 常量位置
  • 要点
  • 参考
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档