[英]How to declare NSString constants for passing to NSNotificationCenter
我的.h文件中有以下内容:
#ifndef _BALANCE_NOTIFICATION
#define _BALANCE NOTIFICATION
const NSString *BalanceUpdateNotification
#endif
以及我的.m文件中的以下内容:
const NSString *BalanceUpdateNotification = @"BalanceUpdateNotification";
我使用以下代码:
[[NSNotificationCenter defaultCenter]
addObserver:self
selector:@selector(updateBalance:)
name:BalanceUpdateNotification
object:nil];
和
[[NSNotificatoinCenter defaultCenter]
postNotificationName:BalanceUpdateNotification
object:self userInfo:nil];
哪个有效,但它给了我一个警告:
Passing argument 1 of 'postNotificationName:object:userInfo' discards qualifiers from pointer target type
所以,我可以将其转换为(NSString *),但我想知道这样做的正确方法是什么。
通常,您在标头中将变量声明为extern
。 最惯用的方式似乎是这样的:
#ifndef __HEADER_H__
#define __HEADER_H__
extern NSString * const BalanceUpdateNotification;
#endif
#include "header.h"
NSString * const BalanceUpdateNotification = @"BalanceUpdateNotification";
extern
告诉编译器,某个类型为NSString * const
的名称为BalanceUpdateNotification
存在于某处。 它可能在包含标题的源文件中,但可能不是。 确保它确实存在并不是编译器的工作,只是根据您输入的方式适当地使用它。 确保BalanceUpdateNotification
实际上已在某处定义,并且只有一次,这是BalanceUpdateNotification
工作。
将const
放在*
意味着您无法将BalanceUpdateNotification
重新BalanceUpdateNotification
为指向不同的NSString
。
NSStrings
是不可变的,因此声明const NSString *
将是多余的; 只需使用NSString *
。
如果你要做的是声明指针本身不能改变,那将是:
NSString * const BalanceUpdateNotification = @"BalanceUpdateNotification";
另请参见Objective-C中的常量
我认为没有理由不使用带有预处理器指令的常量文字。 #import
完成了包含警卫的工作,所以你可以简单地说
#define AutomaticallyResumeDownloads @"AutomaticallyResumeDownloads"
然后#import包含该定义的标题,无论它在何处需要。
通常,人们不会使这些变量保持不变。 另一方面,人们会在头文件中将它们声明为外部。 这是(一点点),因为当你说const NSString *string
,你告诉编译器字符串指向的内存不会改变 - 这既无用也不一定正确,因为我们无法控制apple的类如何管理状态变量。 (虽然在运行时声明的NSStrings放在文本段中,但功能可能会在不同版本之间发生变化。)如果你真的想使用const,我仍然建议不NSString * const string
,它应该是NSString * const string
,这将阻止指针来自被改变为指向不同的记忆位置(否则不会这样做);
这是为观察者声明NSString名称的工作解决方案。
static NSString *const MyCustomNotificationName = @"MyCustomNotificationName";
Apple在他们自己的文档中有一个建议,除其他外,使用宏APPKIT_EXTERN
而不是extern
。 结合在Xcode中创建的默认头文件的内容,这是一个完整的实现:
Constants.h
:
#import <Cocoa/Cocoa.h>
#ifndef Constants_h
#define Constants_h
APPKIT_EXTERN NSString *MyConstantName;
#endif
Constants.m
:
#import "Constants.h"
NSString *MyConstantName = @"MyConstantValue";
据Apple称,我认为上述或多或少是实现字符串常量的标准方法。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.