2013-10-21 49 views
0

我有很多我的项目使用的一堆类。其中一些类必须访问我创建的其他特殊类。因为我想让这些类独立于其他类,所以我不想让#import行跨越不属于同一类的导入类。我想访问这些类的信息,而不必使用#import行。构建自包含类

苹果有一些特殊的东西,可以访问,而无需导入任何东西。例如:

[[UIApplication sharedApplication] delegate] 

[[UIScreen mainScreen] bounds] 

如何创建类这样的。类,我可以简单地做一个

[[MyClass sharedClass] property] 

[[MyClass sharedClass] runThis] 

,并有机会获得它。没有任何#import行。

注意,因为我不是在谈论一个普通的单身人士。单身人士,你还必须导入其文件。

这可能吗?

+0

您通过适当的设计让类彼此“分离”,而不是通过不导入必需的标题。 – CouchDeveloper

回答

2

之所以看不到这些类的导入是因为你有UIKit框架为你的项目,该项目有效地导入这些类.h文件到您创建的每个类的一部分。然而,通过利用objective-c中的动态分派和动态类型,可以做到你所描述的内容,但是,在分离方面,你将失去编译时错误检查。 。

例如,我的UIApplication委托与名称的NSManagedInstance属性的子类“managedObjectInstance我不导入该子类的.h文件中,而是使用valueForKey:方法如下所示:

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

NSObject强制转换仅仅是因为sharedApplication的委托属性是一个id,这意味着它不一定符合KVO。要调用一个你知道存在于某个类中的方法而不会引发警告,可以使用performSelector:像这样的功能家族

[objectOfSomeClassWeDidntImport performSelector: @selector(amethodWeKnowExists)] 
+0

好吧,这可能接近我想要的,但你正在访问委托上的变量。你如何在随机课上访问某些东西(财产,方法或伊维尔)? – SpaceDog

+0

属性,你会通过KVO做,就像我在第一个例子中说的那样; managedObject是这种情况下的一个属性。看到我的编辑你的下一个问题。我从来没有遇到过一个ivar的场景......但是再一次,你如何在没有方法的情况下从课堂外首先获得它? –

+0

我认为这可以做到这一点。谢谢 – SpaceDog

1

你可以做到这一点....

只是让你进口projectName-Prefix.pch文件

和无论你想使用导入文件的内容。

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

相关问题