【问题标题】:How to set methods deprecated only in public interface in Objective C如何设置仅在Objective C的公共接口中不推荐使用的方法
【发布时间】:2014-01-17 12:23:21
【问题描述】:

将任何方法设置为弃用同样简单。见How do I flag a method as deprecated in Objective-C 2.0?

但是:我怎样才能设置一个只供公众使用而弃用的方法?

【问题讨论】:

  • 我主要使用deprecated 标志进行重构。在那种特殊情况下,我要求我有一种方法,我想保留在课堂上供内部使用。同时它不应该再公开使用,因为我提供了一个改进的。但由于它的工作方式有点不同,我不能立即在任何地方使用它。

标签: objective-c deprecated


【解决方案1】:

另一种选择是添加一个在您的构建标志中定义但未在他们的构建标志中定义的宏。

// Add -DBUILDING_MYPROJECT=1 to your own build flags. 
#if BUILDING_MYPROJECT
#   define MYPROJECT_DEPRECATED_API
#else
#   define MYPROJECT_DEPRECATED_API DEPRECATED_ATTRIBUTE
#endif
...    
-(void) method  MYPROJECT_DEPRECATED_API;  // deprecated for clients, not deprecated for you

【讨论】:

  • 感谢您的回答。也是一个有趣的方法。但就我而言,我实际上并没有像项目一样工作框架。请参阅我对这个问题的补充评论。
【解决方案2】:

您可以在两个标题中定义它......在两个不同的类别中。

不要在类本身上定义它。

这样你就分开了


例如你有:

T 有一个弃用的属性。 但在内部你想使用它

所以对于“客户”,您将其公开为类别中已弃用,而私有 m 文件只是声明它本身未弃用

主文件:(客户端)

#import <Foundation/Foundation.h>
#import "T+Public.h"

int main(int argc, const char * argv[])
{

    @autoreleasepool {
        T *t = [[T alloc] init];
        NSLog(@"%@", t.deprecated);

    }
    return 0;
}

T.h

#import <Foundation/Foundation.h>

@interface T : NSObject
@end

和T公开

#import "T.h"

@interface T (Public)
@property(nonatomic, readonly, copy) NSString *deprecated DEPRECATED_ATTRIBUTE;
@end

最后 T.m 不导入公共接口

#import "T.h"

@interface T ()
@property(nonatomic, copy) NSString *deprecated;

@end
@implementation T

- (id)init {
    self = [super init];
    self.deprecated = @"LALA";
    NSLog(@"%@", self.deprecated); //NOT DEPRECATED!
    return self;
}

@end

【讨论】:

  • 感谢您(在我看来是最好的)答案/解决方案。但是,无。它仍然是 Object-C 可能不支持的解决方法。就我而言,拥有一个单独的接口文件可能有点复杂。还要记住,它需要导入特定的头文件以使用该类,这可能会在未来因为协作开发人员甚至我自己而变得混乱。 但是我认为这是一个很好且易于理解的解决方案。
  • 我同意它引入了复杂性,这只是一种解决方法:)
猜你喜欢
  • 2011-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-05
  • 2013-02-14
  • 1970-01-01
  • 1970-01-01
  • 2019-01-15
相关资源
最近更新 更多