在 iOS 中禁用 NSParameterAssert

Posted

技术标签:

【中文标题】在 iOS 中禁用 NSParameterAssert【英文标题】:Disable NSParameterAssert in iOS 【发布时间】:2019-11-28 08:43:39 【问题描述】:

我想在应用程序中禁用 NSParameterAssert

我正在使用 AFOAuth2Manager 使用 pod。因此我无法评论或删除此特定文件中的行。此文件(AFOAuth2Manager.m)完全取决于 podfile

我想在我的项目中禁用以下行

NSParameterAssert(url);

NSParameterAssert(clientID);

NSParameterAssert(secret);

请检查 AFOAuth2Manager.m 文件中包含的以下代码

- (id)initWithBaseURL:(NSURL *)url
 sessionConfiguration:(NSURLSessionConfiguration *)configuration
             clientID:(NSString *)clientID
               secret:(NSString *)secret 
    NSParameterAssert(url);
    NSParameterAssert(clientID);
    NSParameterAssert(secret);
    self = [super initWithBaseURL:url sessionConfiguration:configuration];
    if (!self) 
        return nil;
    
    self.serviceProviderIdentifier = [self.baseURL host];
    self.clientID = clientID;
    self.secret = secret;
    self.useHTTPBasicAuthentication = YES;
    [self.requestSerializer setValue:@"application/json" forHTTPHeaderField:@"Accept"];
    return self;

您能帮我解决这个问题吗?

【问题讨论】:

为什么需要这样做? “断言”表示如果不满足这个条件,这个方法就不能正常工作。 【参考方案1】:

是的,技术上你可以做到。

# Inject the target macro.
post_install do |installer|
    installer.pods_project.targets.each do |target|
        if target.name == "AFOAuth2Manager"
            target.build_configurations.each do |config|
                config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] ||= ['$(inherited)']
                config.build_settings['GCC_PREPROCESSOR_DEFINITIONS'] << 'NSParameterAssert'
            end
        end
    end
end

此钩子脚本将用nil 替换来自Foundation.framework 的原始NSParameterAssert 定义,您可以在运行pod install 后在Pods 项目的AFOAuth2Manager 目标中检查此构建设置。现在 Xcode 开始使用预定义的宏构建该目标,这确实是一种 hack 方式。

先说一下宏NSParameterAssert的用法,这个宏是用来在开发库的时候断言需要的参数的。它希望库调用者将nonnull 参数传递给当前方法,您(调用者)有责任在调用方法之前检查可空性条件。

所以,你更喜欢这样的方式:


if (url && clientID && secret) 
    AFOAuth2Manager *manager = [[AFOAuth2Manager alloc] initWithBaseURL:url
                                                   sessionConfiguration:configuration
                                                               clientID:clientID
                                                                 secret:secret];
 else 
    # ...


【讨论】:

以上是关于在 iOS 中禁用 NSParameterAssert的主要内容,如果未能解决你的问题,请参考以下文章

如何在整个应用程序中禁用 iOS 11 拖动?

在 iOS 中禁用 NSParameterAssert

如何在 iOS 中禁用导航栏

在 iOS 模拟器中禁用调试选项卡 [重复]

在 iOS 6 中启用自动布局,在 < iOS6 中禁用自动布局

如何在 iOS 中禁用单个 HTML 元素的触摸操作