【问题标题】:dynamic Instance naming动态实例命名
【发布时间】:2011-09-16 20:26:34
【问题描述】:

我正在开发一款 iPad 应用程序,需要一些帮助。

通过我的应用程序中的一个按钮,我想一次创建一个对象。 所以每次触摸按钮时都应该创建一个对象。

我遇到的问题是:我想为每个对象分配一个动态名称来标识这个对象。 这将类似于:form0、form1、form2、...、formN。

此名称对应于每个对象中的一个实例变量。 所以 form1 实例的 number 属性是 1。

但是如何将这个 form1、form2 等分配给一个新实例呢?

我尝试通过返回一个创建 formX-String 的方法来初始化一个新实例:

-(NSString*)giveMeName{
NSString* simpleName = @"form";
NSString* newName = [simpleName stringByAppendingString:[NSString stringWithFormat:@"%d", questionCounter]];
return newName;

}

其中 questionCounter 是一个变量,它保存了 formX 和实例编号属性的 int 标识符。

但是当我想用这个函数作为名称初始化一个新实例时,它不起作用:

TSForm* [self giveMeName] = [[TSForm alloc] initWithInt:questionCounter headline:headlineText intro:introText];

很明显,我对 Objective-C 的内部工作有问题。 请帮帮我。

【问题讨论】:

标签: iphone objective-c ios ipad ios4


【解决方案1】:

您尝试做的事情实际上是不可能的。实现所需效果的一种方法是使用 NSDictionary。对于您创建的每个 TSForm 对象,您将该对象添加到字典中,并使用 giveMeName 返回值的键。

所以你从创建你的字典开始:

NSMutableDictionary *formDict = [[NSMutableDictionary alloc] init];

然后,每次创建对象时,将其添加到字典中:

id *newTSForm = [[TSForm alloc] init]; // Or however you create a TSForm
[formDict setObject:newTSForm forKey:[newTSForm giveMeName]];

然后,当您想提取您要查找的表格时,您只需根据您提供的名称询问字典即可:

 [formDict valueForKey:nameOfForm]; // nameOfForm is the name provided by giveMeName

希望这会有所帮助!

【讨论】:

  • 理论上,您可以使用 class_addIvar 动态定义新的实例变量。这样做的问题(我从未尝试过)是您必须在创建任何实例之前执行此操作,因此对于上述情况来说它是无用的。
  • 谢谢你,伙计。我试试看!
【解决方案2】:

使用 NSMutableArray 并继续在那里添加您的项目。

【讨论】:

    【解决方案3】:

    即使您尝试做的事情在技术上是可行的,那也是在低级 Objective-C 运行时和 KVC 东西中使用 tricsk 等等。

    使用简单的 NSMutableArray 来跟踪所有实例(并使用数组中的索引来了解您正在处理的表单)是要走的路。

    我不认为你真的需要你唯一标识符的东西(如果是这样,你可能以错误的方式考虑你的项目),只要你在你的代码中有一种方法来区分每种形式并操纵它们(创建的第一个表单将位于索引 0 处,第二个位于 NSMutableDictionary 的索引 1...)

    如果出于某种奇怪的原因您确实需要这个特殊的唯一标识符,您仍然可以使用 NSMutableDictionary 并将唯一标识符用作您的 dict 的键,并将表单用作关联的值。但是您之前可能应该三思而后行地考虑您的架构和真正的需求,因为根据您在问题中对需求的描述,这样做似乎很奇怪应用架构/设计。

    【讨论】:

    • 谢谢!是的,我知道我所做的并不是它应该的样子。所以 NSMutableArray 或 NSMutableDictionary 将是我的首选武器。
    【解决方案4】:

    您正在寻找的是某种可变变量,它在 Objective-C 中并不真正存在。

    这个问题(Objective C Equivalent of PHP's “Variable Variables”) 有一些不同的建议以获得相似的结果。

    【讨论】:

      猜你喜欢
      • 2012-05-14
      • 1970-01-01
      • 1970-01-01
      • 2020-05-14
      • 2014-01-04
      • 1970-01-01
      • 1970-01-01
      • 2018-11-03
      • 2011-08-07
      相关资源
      最近更新 更多