Objective c 目标C:如何支持不推荐的方法

Objective c 目标C:如何支持不推荐的方法,objective-c,ios,deprecated,Objective C,Ios,Deprecated,因此,对于每一个新操作系统,都会有一堆方法被声明为不推荐使用。对我来说,奇怪的是,如果我想继续支持iOS5和iOS6,我必须使用弃用的和替换的方法,就像UILabel的minimumScaleFactor超过minimumFontSize一样 如果我将myLabel.minimumFontSize替换为myLabel.minimumScaleFactor,我的应用程序将在iOS5中崩溃 因此,我使用带有选择器的-respondsToSelector:的if来确定操作系统是5还是6,并相应地使用m

因此,对于每一个新操作系统,都会有一堆方法被声明为不推荐使用。对我来说,奇怪的是,如果我想继续支持iOS5和iOS6,我必须使用弃用的和替换的方法,就像
UILabel
minimumScaleFactor
超过
minimumFontSize
一样

如果我将
myLabel.minimumFontSize
替换为
myLabel.minimumScaleFactor
,我的应用程序将在iOS5中崩溃

因此,我使用带有选择器的
-respondsToSelector:
if
来确定操作系统是5还是6,并相应地使用
minimumScaleFactor
minimumFontSize

问题是,我可能不得不在代码中编写一堆
if
s和
respondstoselector
,这让我觉得很愚蠢


有没有更好的方法来处理不推荐使用的问题?

语言无关解决方案:在应用程序开始时获取操作系统并设置一个全局变量。然后,当需要查询操作系统版本的变量时。您可以在case/switch语句中执行此操作,以便在将来的版本发生更改时易于扩展

伪代码:

switch iOSversion
    case < 6
        dothis
        break
    case <7
        dothat
        break
    case >7
        OS not supported ;)
切换版本
病例<6
多蒂斯
打破
案例7
不支持操作系统;)

从技术上讲,这与IFs是一样的,但您的源代码会更短、更结构化,而且您不必每次都查询操作系统版本,只需在应用程序开始时查询一次。

为此,您应该将部署目标设置为最低。这样,如果你运行你的应用程序。在那个时候,它不会给你不推荐的错误。而且你也不需要在代码中写if和respondstoselector。您可以将部署目标设置为ios 5.0或5.1 我想这对你有用。
如果您希望您的部署目标为6.0,那么将有另一种方法可以取代不推荐使用的方法

我将“弃用”视为一个警告,指出某个方法可能在将来某个时候消失,而不是现在就必须替换它。我没有使当前版本的代码复杂化,而是在放弃对某些旧版本的支持时,给自己留下了一些关于要更改什么的注释


除了在新版本中停止工作的功能外,我不按版本进行定义。

我创建了可以在任何ios中使用的功能:

void AbsSdk30_upg60_UILabel_setMinimumScaleFactor(UILabel * label, CGFloat minimumScaleFactor) {
    if ([label respondsToSelector: @selector(setMinimumScaleFactor:)]) {
        [label setMinimumScaleFactor: minimumScaleFactor];
    }
    else {
        const CGFloat curFontSize = label.font.pointSize;
        const CGFloat fontSize = (0.0 == curFontSize) ? [UIFont labelFontSize] : curFontSize;
        [label setMinimumFontSize: fontSize * minimumScaleFactor];
    }
}

在.h文件或.h和.m文件中向UILabel添加一个类别,其中.h文件将由使用它的代码导入:

@interface UILabel (UILabelCategory)

+ (CGFloat)minimumLabelFontSize;
- (void)adjustsFontSizeToFitWidthWithMinimumFontSize:(CGFloat)fontSize;

@end

@implementation UILabel (UILabelCategory)

+ (CGFloat)minimumLabelFontSize // class method that returns a default minimum font size
{
    return 11;
}

- (void)adjustsFontSizeToFitWidthWithMinimumFontSize:(CGFloat)fontSize
{
    if ([self respondsToSelector: @selector(setMinimumScaleFactor:)])
    {
        CGFloat currentFontSize = self.font.pointSize == 0 ? [UIFont labelFontSize] : self.font.pointSize;
        [self setMinimumScaleFactor:fontSize / currentFontSize];
    }
    else
    {
        [self setMinimumFontSize:fontSize]; // deprecated, only use on iOS's that don't support setMinimumScaleFactor
    }
    [self setAdjustsFontSizeToFitWidth:YES];
}

@end
然后从代码中的多个位置像这样调用UILabel扩展: (假设您有一个名为_指令的UILabel对象,并且您导入了实现UILabelCategory扩展名的文件)

或者像这样:

[_instructions adjustsFontSizeToFitWidthWithMinimumFontSize:14];
[_instructions setNumberOfLines:1]; // on iOS6 and earlier the AdjustsFontSizeToFitWidth property is only effective if the numberOfLines is 1
注意:请记住,在iOS 6及之前的版本中,setMinimumFontSize仅在您还将行数设置为1时有效,如下所示:

[_instructions adjustsFontSizeToFitWidthWithMinimumFontSize:14];
[_instructions setNumberOfLines:1]; // on iOS6 and earlier the AdjustsFontSizeToFitWidth property is only effective if the numberOfLines is 1

我怀疑像这样的“不支持操作系统”逻辑会破坏新操作系统中的某些应用程序。开发人员禁止软件在不等待发现不兼容(可能没有)是什么的情况下在更高版本上运行。您可能是对的,尽管这种方式可能比开发人员在确定之前允许任何操作系统版本要好,他的代码不会破坏新系统上的任何东西。你是对的:它避免了开发人员无意中破坏未来的系统。如果你不能测试它(因为它还不存在),那么你就不能支持它(还存在)。可能的重复答案很好:它不是重复的,我的问题更一般,范围更广。