如何找到一个实例的类,然后在objective-c中声明该类的另一个实例?

Posted

技术标签:

【中文标题】如何找到一个实例的类,然后在objective-c中声明该类的另一个实例?【英文标题】:How to find the class of a instance and then declare one more instance of that class in objective - c? 【发布时间】:2014-06-16 07:01:43 【问题描述】:

我正在使用core-graphics,在我的应用程序中,我正在绘制不同类型的形状并对其进行操作。所以我有大约 150 个UIView 对象(形状),可以由用户选择。

我有一个NSObject 类,它有滑块来改变形状的大小。所以我将视图实例从每个UIView 传递给这个NSObject 类来修改那里的大小。

NSObject 类中,我有如下函数:

-(id) initWithView:(id)shapeView

   ...

因此,在运行时,当用户选择一个形状并移动滑块时,该形状的实例将传递给NSObject 类中的此函数。现在我可以操纵特定“shapeView”的大小了。

但问题是我无法访问它所属的UIView 类的函数。

我不能使用类似下面的东西,因为 shapeView 的类型在编译时是未知的并且它会抛出错误:

[shapeView someFunction:];

例如,用户在应用程序中选择了一个矩形。那么shapeView的Class类型就是Rectangle。我可以使用[view class] 找到这个。所以我可以修改矩形的大小但不能访问它的功能。要访问函数,我必须在 NSObject 类中声明 Rectangle 类型的实例。所以我的问题是如何从实例中提取类名(在本例中为 shapeView)并声明该类类型的实例。

我知道一种方法是检查UIView 类的每种类型的类型,然后相应地创建实例。但正如我所说,有 150 个UIView 类,将来我会添加更多。那么有没有其他方法可以解决这个问题呢?

【问题讨论】:

您在参数中收到视图,为什么需要创建实例? 我相当肯定将这些形状作为UIView 的子类是错误的方法。更好的是创建一个名为ShapeNSObject 的子类)的类,其属性类似于positionCGPoint)和一个名为draw(在绘制父级UIView 时调用)的方法,然后从这个Shape 基类派生形状基元。 您可以忽略 Runtime.h 文件。它设置了所有运行时函数。 @***foe :我想过,但问题是,这只是应用程序的一部分。我有许多与形状类型相关的触摸手势,例如旋转、平移和通过捏合改变方向等。如果没有 UIView,这些事件是否可能? @blancos 好点。然而,一层可能会稍微便宜一些,但我不确定要便宜多少。 【参考方案1】:

我认为为每个单独的形状创建一个子类并不是一个好主意。如果你有一个不规则形状的多边形,最好先声明一个像Polygon 这样的类,然后声明像numberOfSidesarea 这样的属性,甚至是NSArray* edgesNSArray* angle。然后你会有一个方法drawRectangle,它将获取该数据并根据它拥有的帧在屏幕上呈现它。

CircularComposite 可能是其他类,复合是由另外 2 个单独定义的形状组成的任何奇数形状。

我建议您重新考虑您的设计,使其更易于管理。您永远不必维护那么多类,这就是我们首先使用Polymorphism 的原因。

【讨论】:

同意。但正如我在 cmets 中提到的,我有很多触摸手势需要处理,具体取决于形状。 这些触摸手势也可以在类和基于边数和角度数的行为中实现。您觉得需要拥有这么多子类有什么问题? @blancos 旋转时,我会使用超类 (UIView) 实现进行旋转。这将旋转整个视图,这比旋转视图的内容要好(我假设这是你正在做的事情)。平移和定向可以与平移视图本身的方式相同。 触摸手势仅适用于 UIView。而且您的方法不是一次考虑多种形状。旋转超类 UIView 将旋转此时存在的所有形状。并且用户不能同时处理多个形状,因为所有形状都在一个视图中。 @blancos 你的形状 UIViews 不是吗?这意味着它们本身就是一个视图,作为一个视图,它们支持旋转和触摸手势之类的东西。不要将super**class**super**view** 混淆。如果您旋转super**view**,那么它也会旋转其所有同级视图。但是如果你使用它的super**class** 实现来旋转形状(视图),那么它只会旋转那个形状(视图)。

以上是关于如何找到一个实例的类,然后在objective-c中声明该类的另一个实例?的主要内容,如果未能解决你的问题,请参考以下文章

将受保护的 Objective-C 实例变量公开给子类

objective-c 单例

SpriteKit Objective-C:SKSpriteNode 类实例上的 touchesBegan()

深入解析 Objective-C 中方法的结构

[iOS开发]Objective-C对象模型

如何在 Objective-C 中保存另一个类正在使用的类对象?