iOS中extern的用法

虽然是很基础的知识点,但是自己不试一下还真不知道原来要这样用。

先说一个无关的小知识点或技巧:
多用类型常量,少用#define预处理指令。(好处这里就不说了)

总之就是

static const NSTimeInterval kAnimationDuration = 0.3; //推荐
#define ANIMATION_DURATION 0.3 //不推荐

这里说一下,static修饰符则意味着该变量仅此在定义此变量的编译单元中可见。但有时需要对外公布某个常量。例如通知的名字,发送通知,需要使用通知名称,注册通知也需要,所以此时这个名字可以声明为一个外界可见的常值变量。怎么用,通过一个小例子说明:

  1. 在发送通知的控制器的.h文件中声明XXVCLoginSuccessNotification 登录成功的通知名称
#import 

extern NSString *const XXVCLoginSuccessNotification;

@interface XXLovinVC : UIViewController

@end

  1. 在发送通知的控制器的.m文件中定义其值
#import "XXLovinVC.h"

NSString *const XXVCLoginSuccessNotification = @"XXVCLoginSuccessNotification";

@interface XXLovinVC ()

@end

@implementation XXLovinVC

- (void)viewDidLoad {
    [super viewDidLoad];
 
    self.view.backgroundColor = [UIColor yellowColor];
    
    //发送登录成功的通知
    [[NSNotificationCenter defaultCenter] postNotificationName:XXVCLoginSuccessNotification  object:nil];

    [self.navigationController popViewControllerAnimated:YES];
}

  1. 在另一个页面注册通知的.m文件中直接调用(这里有个条件,就是导入了XXLovinVC头文件的条件)
#import "ViewController.h"
#import "XXLovinVC.h"

@interface ViewController ()

@end

@implementation ViewController


- (void)viewDidLoad {
    [super viewDidLoad];

   [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loginSucess) name:XXVCLoginSuccessNotification object:nil];
        
}
  1. 如果在一个没有导入声明XXVCLoginSuccessNotification的文件中使用,则会报错,如下图。
    没有导入声明extern常量的头文件会报错.png

如何解决?需要在此文件的.h或者.m文件中,再次声明

#import "AppDelegate.h"

extern NSString *const XXVCLoginSuccessNotification;

@interface AppDelegate ()

@end

@implementation AppDelegate


- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {

    [[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(loginSucess) name:XXVCLoginSuccessNotification object:nil];
    
    return YES;
    
}

不过看SDWebImage中对SDWebImageDownloadStartNotification的处理是都放在了.h文件中了。


iOS中extern的用法_第1张图片
SDWebImageDownLoader监听通知.png

你可能感兴趣的:(iOS中extern的用法)