构建自包含类

Posted

技术标签:

【中文标题】构建自包含类【英文标题】:Building self contained classes 【发布时间】:2013-10-21 04:36:04 【问题描述】:

我的很多项目都使用了一堆类。其中一些类必须访问我创建的其他一些特殊类。因为我想让这些类尽可能独立于其他类,所以我不想让#import 行来交叉导入不属于一起的类。我想在不使用#import 行的情况下访问这些类的信息。

Apple 有一些特殊的东西可以在不导入任何东西的情况下访问。例如:

[[UIApplication sharedApplication] delegate]

[[UIScreen mainScreen] bounds]

我如何创建这样的类。我可以简单地做的课程

[[MyClass sharedClass] property]

[[MyClass sharedClass] runThis]

并可以访问它。没有任何#import 行。

注意,因为我不是在谈论普通的单身人士。一个单例,你仍然需要导入它的文件。

这可能吗?

【问题讨论】:

您可以通过适当的设计使类彼此“分离”,而不是通过不导入强制标头。 【参考方案1】:

您看不到这些类的导入的原因是您将 UIKit 框架作为项目的一部分,它有效地将这些类的 .h 文件导入到 每个 类中你创造。但是,在分离方面,可以通过利用 Objective-c 中的动态调度和动态类型来执行您所描述的操作,但是您将失去编译时错误检查。

例如,我有一个 UIApplication 委托的子类,其 NSManagedInstance 属性名为“managedObjectInstance”。我不导入此子类的 .h 文件,而是使用 valueForKey: 方法,如下所示:

[((NSObject*)[UIApplication sharedApplication].delegate) valueForKey: @"managedObjectContext"];

NSObject 转换只是因为 sharedApplication 的 delegate 属性是一个 id,这意味着它不一定符合 KVO。要在不引发警告的情况下调用您知道存在于类中的方法,您可以使用 performSelector: 系列函数,如下所示

[objectOfSomeClassWeDidntImport performSelector: @selector(amethodWeKnowExists)]

【讨论】:

好的,这可能接近我想要的,但您正在访问委托上的变量。您如何访问随机类上的某些内容(属性、方法或 ivar)? 像我在第一个示例中所说的那样通过 KVO 执行的属性;在这种情况下,managedObject 是一个属性。请参阅我的编辑以了解您的下一个问题。我从来没有遇到过使用 ivar 的场景......但话说回来,你是如何在没有方法的情况下从你的班级之外获得它的?【参考方案2】:

你可以做到的......

只需在 projectName-Prefix.pch 文件中进行导入

并在任何你想要的地方使用导入文件的内容。

您可以在 Resources 文件夹中找到.pch 文件。

【讨论】:

以上是关于构建自包含类的主要内容,如果未能解决你的问题,请参考以下文章

我在哪里把我的自定义类和函数放在 Laravel 中

是否可以使用 gcc 构建一个自包含的库(即静态合并其依赖项的库)?

使用自包含框架时,dot net core 3.1 的设置 CI 构建配置失败

Maven学习-项目对象模型

使用 MSBuild 构建 gRPC dotnet 核心项目时如何包含自定义目录

“不支持”在不指定 RuntimeIdentifier 的情况下构建或发布自包含应用程序