Objective c 如何在Objective C中设置仅在公共接口中弃用的方法

Objective c 如何在Objective C中设置仅在公共接口中弃用的方法,objective-c,deprecated,Objective C,Deprecated,将任何方法设置为不推荐使用也同样简单。看 但是:我如何设置一个只供公共使用的方法 您可以在两个标题中定义它。。分为两类 不要在类本身上定义它 这样你就能把它们分开 e、 g.你有: T具有不推荐使用的属性。 但在内部,你想使用它 因此,对于“客户机”,您在类别中将其公开为已弃用,而私有m文件只是声明它本身未弃用 主文件:(客户端) 最后是不导入公共接口的T.m #import "T.h" @interface T () @property(nonatomic, copy) NSString

将任何方法设置为不推荐使用也同样简单。看


但是:我如何设置一个只供公共使用的方法

您可以在两个标题中定义它。。分为两类

不要在类本身上定义它

这样你就能把它们分开


e、 g.你有:

T具有不推荐使用的属性。 但在内部,你想使用它

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

主文件:(客户端)

最后是不导入公共接口的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

另一种选择是添加在构建标志中定义的宏,而不是在构建标志中定义的宏

// 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

让我们感谢你(我认为是最好的)回答/解决方案。但是unf。它仍然是Object-C可能不支持的解决方案。对于我来说,拥有一个单独的接口文件可能有点复杂。还要记住的是,它需要导入一个特定的头文件来使用该类,这可能会让协作开发人员甚至我自己将来感到困惑。不过,我认为这是一个好的、易于理解的解决方案。我同意这会带来复杂性,而且这只是一个解决办法:)谢谢你的回答。这也是一个有趣的方法。但在我的例子中,我实际上并不像项目那样使用框架。请参阅我对这个问题的补充意见。我主要使用
弃用
标志进行重构。在那个特殊的案例中,我要求我有一种方法,我想保留在课堂上供内部使用。同时,它不应该再公开使用,因为我提供了一个改进的。但由于它的工作原理有点不同,我不能马上就到处使用它。
#import "T.h"

@interface T (Public)
@property(nonatomic, readonly, copy) NSString *deprecated DEPRECATED_ATTRIBUTE;
@end
#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
// 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