繁体   English   中英

如何声明NSString常量以传递给NSNotificationCenter

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM