首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

方法“”UIKit.UIApplication.Main“”已过时:为类型安全起见,请使用具有“”type“”参数的重载,而不是“”String“”参数

基础概念

UIKit.UIApplication.Main 是 iOS 开发中的一个方法,用于启动应用程序的主事件循环。这个方法在过去被广泛使用,但现在已经被标记为过时(obsolete),因为它使用字符串来指定入口点,这种方式不够类型安全。

相关优势

使用具有 type 参数的重载方法的优势在于:

  1. 类型安全:通过使用类型而不是字符串,编译器可以在编译时检查错误,减少运行时错误的可能性。
  2. 代码可读性:类型参数使得代码更易读,更易于维护。
  3. 更好的设计:类型安全的接口设计符合现代编程的最佳实践。

类型

新的重载方法通常会接受一个表示入口点类型的参数,例如 UIApplicationDelegate 的子类。

应用场景

在 iOS 应用程序中,通常需要在 AppDelegate 类中启动应用程序的主事件循环。使用新的重载方法可以确保类型安全,并且代码更加清晰。

问题原因及解决方法

问题原因

UIKit.UIApplication.Main 方法被标记为过时,主要是因为它使用字符串来指定入口点,这种方式容易出错,并且在编译时无法进行类型检查。

解决方法

使用具有 type 参数的重载方法来替代 UIKit.UIApplication.Main。以下是一个示例代码:

代码语言:txt
复制
using UIKit;

namespace MyApp
{
    [Register("AppDelegate")]
    public class AppDelegate : UIApplicationDelegate
    {
        public override void FinishedLaunching(UIApplication application, NSDictionary launchOptions)
        {
            // 初始化代码
        }
    }

    public class Program
    {
        static void Main(string[] args)
        {
            UIApplication.Main(args, null, typeof(AppDelegate));
        }
    }
}

在这个示例中,UIApplication.Main 方法的调用使用了 typeof(AppDelegate) 作为类型参数,而不是字符串。这样可以确保类型安全,并且代码更加清晰。

参考链接

通过这种方式,你可以避免使用过时的方法,并且提高代码的类型安全性和可维护性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

代码质量规则

CA1030:在适用处使用事件 该规则检测名称通常用于事件方法。 如果响应明确定义状态更改调用一个方法,则应由事件处理程序调用该方法。 调用该方法对象应引发事件不是直接调用该方法。...由于调用静态成员不需要类型示例,因此没必要使用构造函数。 安全起见,字符串重载应使用字符串自变量调用统一资源标识符 (URI) 重载。...CA1307:为了清晰起见,请指定 StringComparison 字符串比较运算使用不设置 StringComparison 参数方法重载。...CA1830:在 StringBuilder 上优先使用强类型“追加和插入”方法重载 Append 和 Insert String 之外多种类型提供重载。...CA2249:请考虑使用 String.Contains 不是 String.IndexOf 对 string.IndexOf 调用(其结果用于检查是否存在子字符串)可以用 string.Contains

2.1K30

设计规则

CA1030:在适用处使用事件 该规则检测名称通常用于事件方法。 如果响应明确定义状态更改调用一个方法,则应由事件处理程序调用该方法。 调用该方法对象应引发事件不是直接调用该方法。...当编译使用 ObsoleteAttribute 标记类型或成员时,将显示该特性 Message 属性,这用户提供有关过时类型或成员信息。...由于调用静态成员不需要类型示例,因此没必要使用构造函数。 安全起见,字符串重载应使用字符串自变量调用统一资源标识符 (URI) 重载。...CA1054:URI 参数不应为字符串 如果某方法采用 URI 字符串表示形式,则应提供采用 URI 类实例相应重载,该重载安全方式提供这些服务。...CA1068:CancellationToken 参数必须最后出现 方法具有 CancellationToken 参数,但它不是最后一个参数

2K20
  • 如何在 TypeScript 中使用函数

    除了函数提供额外文档外,类型信息还可以减少代码中出现错误机会,因为将无效数据类型传递给类型安全函数风险较低。...: string) => string; 在此示例中,我们使用 type 关键字声明了一个新类型,然后,括号中两个参数提供了类型,并为箭头后面的返回值提供了类型。...事件回调本身将接收具有以下类型对象作为第一个参数type EventContext = { value: string; }; 然后,我们可以像这样编写 onEvent 函数: type EventContext...简单起见,在此示例中,我们将使用数组: type User = { id: number; firstName: string; }; const users: User[] = [ {...创建用户定义类型保护方法是使用以下语法作为函数返回类型: parameterName is Type 其中 parameterName 是我们正在测试参数名称,Type 是此函数返回 true

    15K10

    C#反射特性

    特性来告诉编译器这个方法已经过时,然后当编译器发现当程序中有地方在使用这个用Obsolete标记过方法时,就会给出一个警告信息。...现在运行这段代码,我们会发现编译器给出了一个警告:警告CS0618: “Attribute.TestClass.ShowMsg()”已过时:“请使用SendMsg(Message msg)重载方法”...那么在本例中,元数据应该是:注释类型(“更新”或者“创建”),修改人,日期,备注信息(可有可无)。特性目标类型是DemoClass类。...注意ValidOn属性不是一个命名参数,因为它不包含set访问器。 这里大家一定疑惑为什么会这样划分参数,这和特性使用是相关。...当指定GetCustomAttributes(Type attributeType, bool inherit) 中第一个参数attributeType时,将只返回指定类型特性,否则将返回全部特性;

    84740

    接口和抽象有什么区别?

    使用时机:当想要支持多重继承,或是为了定义一种类型请使用接口; 当打算提供带有部分实现“模板”类,而将一些功能需要延迟实现请使用抽象类;当你打算提供完整具体实现请使用类。...多态,说到多态,会立即想到重写(override) 和重载 (overload),向上转型。 重写是父子类中相同名字和参数方法,不同实现。 重载是相同名字方法,但是不同参数。...要注意方法名称和参数一致,但是返回值不同,这样不是重载,编译会报错!!!...public int doSomething() { return 0; } // 输入参数不同,意味着方法签名不同,重载体现 public int doSomething(Lis<String...开闭原则,对扩展是开放,但是对修改是关闭。程序设计应保证平滑扩展性,尽量避免因为新增同类功能修改实现。这样可以减少回归问题。(回归测试)。

    36820

    Python|Google Python样式指南(2)

    如果foo仅使用一个参数 b调用if,则将其设置0。如果使用两个参数调用if,则b具有第二个参数值。 2.12.2 优点 通常,您有一个使用许多默认值函数,但是在极少数情况下,您想覆盖默认值。...默认参数值提供了一种简便方法不必罕见异常定义很多函数。由于Python不支持重载方法/函数,因此默认参数是“伪造”重载行为简便方法。 2.12.3缺点 默认参数在模块加载时评估一次。...2.14.4 结论 如果可能,请使用“隐式”假,例如,if foo:不是if foo != []:。...2.15 过时语言特性 尽可能使用字符串方法不是字符串模块。使用函数调用语法不是apply。如果函数参数是内联lambda,则使用列表理解和for循环,不是filter和map。...(Type Annotated Code) 2.21.1 定义 类型注释(或“类型提示”)用于函数或方法参数并返回值: def func(a: int) -> List[int]: 您还可以使用类似的

    70930

    性能规则

    CA1810:以内联方式初始化引用类型静态字段 当一个类型声明显式静态构造函数时,实时 (JIT) 编译器会向该类型每个静态方法和实例构造函数中添加一项检查,以确保之前调用该静态构造函数。...CA1826:使用属性,不是 Linq Enumerable 方法 对支持等效且更有效属性类型使用了 Enumerable LINQ 方法。...CA1830:在 StringBuilder 上优先使用强类型“追加和插入”方法重载 Append 和 Insert 除 System.String 之外多种类型提供重载。...CA1831:在合适情况下,字符串使用 AsSpan 不是基于范围索引器 对字符串使用范围索引器并向 ReadOnlySpan 类型隐式赋值时,将使用方法 Substring 而非...CA1834:对单字符字符串使用 StringBuilder.Append(char) StringBuilder 具有将 char 用作其参数 Append 重载

    84600

    Java 程序员必须掌握 5 个注解!

    相反,我们提供了方法重载:我们不是替换Object类提供equals方法实现,而是提供第二个方法来专门接受Foo对象,不是Object对象。...我们意图是覆盖Object#equals方法,但因为我们指定了一个类型Foo不是Object类型参数,所以我们实际上提供了重载Object#equals方法不是覆盖它。...// ClassCastException 在将ln分配给ls后,堆中存在变量ls,该变量具有List类型,但存储引用到实际List类型值。...换句话说,如果可变参数数组仅用于从调用者向方法传递可变数量参数——毕竟,这是可变参数目的——那么该方法安全。...为了支持不推荐使用代码文档,Java包含@Deprecated注解,它会将一些构造函数、域、局部变量、方法、软件包、模块、参数类型标记为弃用。

    75920

    一文带你了解 TypeScript 函数

    [1,2,3],["测试"]) 这样写就会报错,因为TypeScript 识别到了第一个参数Number 类型, 第二个参数 String 类型类型不一,就会报错了,这时,我们可以告诉它 哪些类型...----测试 // 123----------undefined 当没有传递可选类型属性值时,它会返回 undefined, 因为可选类型本身具有联合类型(它本身类型 和 undefined。...函数重载指相同函数名,不同参数,在调用函数时,它会根据你所传递参数进入对应重载函数执行业务逻辑。...makdData不同参数 , 一个实现签名 (它兼容处理了前面两个重载签名逻辑处理) 写好重载技巧 两个重载具有相同参数计数和相同返回类型 可以使用联合类型,改造成函数重载版本 function...⚠️注意: 默认情况下可以理解成typescript将函数中this as any,oImplicitThis:true情况下,必须去声明this类型,才能在函数或者对象中使用this. function

    25611

    现代C++之SFINAE

    如您所见,在序列化过程中,很容易检查对象是否具有属性并查询该属性类型。在我们例子中,它允许我们使用serialize方法(如果可用),否则返回到更通用方法str。功能强大,不是吗?...SFINAE概念只是“健全”编译器保证这种“健全”行为。 所有的表达式都不会导致SFINAE。一个广泛规则是说功能/方法主体之外所有替代都是“安全”。...您编译器确实是个好人,不会遗忘任何分支,因此在这种情况下,obj必须同时具有serialize方法和to_string重载。...到那时,我们可以将hasSerialize函数重新构造序列化函数,并使其返回std :: string不是编译时boolean。但是我们不会那样做!...让我们从消除腐烂方法开始,使用美味decltype和bake 一点点constexpr不是sizeof。

    2.9K20

    C++那些事之SFINAE

    如您所见,在序列化过程中,很容易检查对象是否具有属性并查询该属性类型。在我们例子中,它允许我们使用serialize方法(如果可用),否则返回到更通用方法str。功能强大,不是吗?...SFINAE概念只是“健全”编译器保证这种“健全”行为。 所有的表达式都不会导致SFINAE。一个广泛规则是说功能/方法主体之外所有替代都是“安全”。...您编译器确实是个好人,不会遗忘任何分支,因此在这种情况下,obj必须同时具有serialize方法和to_string重载。...到那时,我们可以将hasSerialize函数重新构造序列化函数,并使其返回std :: string不是编译时boolean。但是我们不会那样做!...让我们从消除腐烂方法开始,使用美味decltype和bake 一点点constexpr不是sizeof。

    2.2K20

    快速掌握JDK常用注解

    /指定该策略注解只能修饰参数类型定义 TYPE_PARAMETER, //JDK1.8版本开始 //指定该策略注解只能修饰一个类型使用 TYPE_USE } 示例...static void methodDeprecated(){ System.out.println("此方法不推荐使用"); } 调用方会出现警告,提示你此方法已经过时请使用最新其他姿势...@SafeVarargs @SafeVarargs在JDK 1.7中引入,主要目的是处理可变长参数泛型,此注解告诉编译器:在可变长参数泛型是类型安全。...可变长参数是使用数组存储数组和泛型不能很好混合使用。 注意:使用@SafeVarargs注解,对于非static或非final声明方法,不适用,会编译不通过。...请注意,可以使用lambda表达式,方法引用或构造函数引用创建函数接口实例。 如果使用此注释类型注释类型,则编译器需要生成错误消息,除非: 类型是接口类型不是注释类型,枚举或类。

    69110

    Hello——Java10新特性,请了解一下

    因为var是一个类型引用对象,它和表达式右边类型具有相同属性。  ...✔ 线程-局部变量管控   这是在 JVM 内部相当低级别的更改,现在将允许在不运行全局虚拟机安全情况下实现线程回调。这将使得停止单个线程变得可能和便宜,不是只能启用或停止所有线程。...String getMethodType(): 返回此堆栈帧所代表方法类型,描述参数类型和返回值类型。 ▪ java.lang.invoke.MethodType:   Class lastParameterType(): 返回这个方法类型最后一个参数类型。如果这个方法类型没有参数,则返回空类型作为岗哨值(Sentinel Value)。...如果这个 JarEntry 是一个多版本 jar 文件入口,它被配置这样处理,这个方法返回名字是 JarEntry 所代表版本条目的入口,不是 ZipEntry.getName()返回基本条目的路径名

    55150

    多重收纳(类模板)C++

    "string") pushBox(cin, pBoxes, type);         // 我们觉得一个盒子也是可以包装另一个盒子         // 为了便捷起见,我们采用盒子指针来表示盒子间包装关系...b)如果包装值是非空指针,那么一般来说打印指针值是没有什么价值,我们更关注是指针所指向内容。 我们希望能够对T*这样模板参数类型定义不同处理方式。...CBox模板类定义适合以原生指针作为模板参数特化版本     由于定义成员变量指针类型,且同一对象被new出来后可能被赋予多个所有者,     为了简化编程,本题不考虑析构函数(使用默认即可)...int*,string*等其它原生指针 如果使用了CBox,请注意为相应T类要有输出重载 5....就是为了对于特定类型来执行不同代码,不是去调用通用模板。

    17230

    Kotlin 编码规约

    : Int, name: String) 具有较长类头类应该格式化,以使每个主构造函数参数都在带有缩进独立行中。..."b", "c") // 良好:listOf() 返回 List val allowedValues = listOf("a", "b", "c") 默认参数值 优先声明带有默认参数函数不是声明重载函数...String, Person> Lambda 表达式参数 在简短、非嵌套 lambda 表达式中建议使用 it 用法不是显式声明参数。...命名参数 当一个方法接受多个相同原生类型参数或者多个 Boolean 类型参数时,请使用命名参数语法,除非在上下文中所有参数含义都已绝对清楚。...,它们并非调用不同超类构造函数,并且不能简化为具有默认参数单个构造函数,那么优先用工厂函数取代这些重载构造函数。

    3.1K22

    Hello——Java10新特性,请了解一下

    因为var是一个类型引用对象,它和表达式右边类型具有相同属性。  ...✔ 线程-局部变量管控   这是在 JVM 内部相当低级别的更改,现在将允许在不运行全局虚拟机安全情况下实现线程回调。这将使得停止单个线程变得可能和便宜,不是只能启用或停止所有线程。...String getMethodType(): 返回此堆栈帧所代表方法类型,描述参数类型和返回值类型。 ▪ java.lang.invoke.MethodType:   Class lastParameterType(): 返回这个方法类型最后一个参数类型。如果这个方法类型没有参数,则返回空类型作为岗哨值(Sentinel Value)。...如果这个 JarEntry 是一个多版本 jar 文件入口,它被配置这样处理,这个方法返回名字是 JarEntry 所代表版本条目的入口,不是 ZipEntry.getName()返回基本条目的路径名

    82650
    领券