虽然是很基础的知识点,但是自己不试一下还真不知道原来要这样用。
先说一个无关的小知识点或技巧:
多用类型常量,少用#define预处理指令。(好处这里就不说了)
总之就是
static const NSTimeInterval kAnimationDuration = 0.3; //推荐
#define ANIMATION_DURATION 0.3 //不推荐
这里说一下,static修饰符则意味着该变量仅此在定义此变量的编译单元中可见。但有时需要对外公布某个常量。例如通知的名字,发送通知,需要使用通知名称,注册通知也需要,所以此时这个名字可以声明为一个外界可见的常值变量。怎么用,通过一个小例子说明:
- 在发送通知的控制器的.h文件中声明XXVCLoginSuccessNotification 登录成功的通知名称
#import <UIKit/UIKit.h>
extern NSString *const XXVCLoginSuccessNotification;
@interface XXLovinVC : UIViewController
@end
- 在发送通知的控制器的.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];
}
- 在另一个页面注册通知的.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];
}
- 如果在一个没有导入声明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
网友评论
XXVCLoginSuccessNotification 在发送通知的那个类头文件中,无需声明