iOS中extern的用法

作者: 落夏简叶 | 来源:发表于2017-12-08 19:28 被阅读159次

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

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

    总之就是

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

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

    1. 在发送通知的控制器的.h文件中声明XXVCLoginSuccessNotification 登录成功的通知名称
    #import <UIKit/UIKit.h>
    
    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文件中了。


    SDWebImageDownLoader监听通知.png

    相关文章

      网友评论

      • Dwyane_Coding:博主你好!
        XXVCLoginSuccessNotification 在发送通知的那个类头文件中,无需声明
        落夏简叶:NSString *const XXVCLoginSuccessNotification = @"XXVCLoginSuccessNotification";这句吗。我需要定义其值。也许还有其他的写法吧,我当时可能没有试到。
      • kafi:extern的作用是表示变量已经声明,只是引用,而不是声明变量
        Dwyane_Coding:你好,extern 是声明,只是不是定义,非 extern 声明的那个此时定义。用extern 表示在程序中一定有个地方定义了该变量

      本文标题:iOS中extern的用法

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