【问题标题】:Creating an array of custom objects in Objective C在 Objective C 中创建自定义对象数组
【发布时间】:2010-09-05 20:11:07
【问题描述】:

编辑 我试图用代码实现的是创建一个由 20 个独特的“人”对象组成的数组。多亏了下面的人,我现在知道我将不再调用 dealloc。

for (int i = 0; i < 20; i++)
{
    Person *myPerson = [[Person alloc] init];
    myPerson.name = @"Brian";
    myPerson.age = [NSNumber numberWithInteger:23];     
    [myArray addObject:myPerson];       
    [myPerson dealloc];         
}

在学习 Objective C 的过程中,为什么这段代码对你来说可能看起来很疯狂。但是我来自 Java,所以我的逻辑对于 Objective C 来说还不是很好。

我试图用 20 个人员对象填充我的数组。但似乎我一直在添加同一个对象人。然后释放它,这会破坏这一点。

所以我的问题是:用 20 个不同的人对象填充数组的正确方法是什么。将来每个人的名字和年龄都会不同,但在我学习的那一刻,它们都是一样的。

只有这样才能输入大量这样的代码:

    Person *myPerson1 = [[Person alloc] init];
    myPerson.name = @"Brian";
    myPerson.age = [NSNumber numberWithInteger:23];     
    [myArray addObject:myPerson1];  
    Person *myPerson2 = [[Person alloc] init];
    myPerson.name = @"Brian";
    myPerson.age = [NSNumber numberWithInteger:23];     
    [myArray addObject:myPerson2];  
    Person *myPerson3 = [[Person alloc] init];
    myPerson.name = @"Brian";
    myPerson.age = [NSNumber numberWithInteger:23];     
    [myArray addObject:myPerson3];  

20 次?还是有更优雅的解决方案?

感谢您的建议。 -代码

【问题讨论】:

    标签: iphone objective-c model-view-controller


    【解决方案1】:

    您的 for 循环代码是正确的,但在循环结束时取消分配 myPerson 除外。您不想释放它,因为该对象由数组保留。通常,您不想直接调用 dealloc,而是希望使用保留/释放。有关内存管理的更多信息,请查看Apple's Guide

    所以你是正确的,只是将 dealloc 更改为 release。

    for (int i = 0; i < 20; i++)
    {
        Person *myPerson = [[Person alloc] init];
        myPerson.name = @"Brian";
        myPerson.age = [NSNumber numberWithInteger:23];     
        [myArray addObject:myPerson];       
        [myPerson release];         
    }
    

    【讨论】:

    • Stronger:任何普通 Objective-C 程序调用dealloc 的唯一时间是在类覆盖dealloc 的末尾,在这种情况下,您将编写[super dealloc]。任何其他用途几乎肯定是错误的。
    • 但不是说我有一个数组包含同一个对象的 20 个副本(20 个指向同一个对象的指针)吗?我想要做的(而不是理解如何)是添加 20 个独特的对象。
    • @Code:不,你没有 20 个指向同一个对象的指针。每次编写[[Person alloc] init] 时都会创建一个新对象,循环的每次迭代都会这样做。它可能看起来就像是损坏的代码所发生的那样,因为每次您dealloced 对象时,它的内存位置都会被释放,并且下一个对象被分配到相同的地址。跨度>
    • @Code:正如您从 DHamrick 的回答和 Rob 的回答中看到的那样,您要么必须自动释放 myPerson,要么释放 myPerson。调用dealloc 是完全错误的。这两种正确的技术都很好,但是对于您对 Objective-C 的理解(尤其是对于不支持垃圾收集的 iPhone),理解这两种技术非常重要。
    • @Code:是的,你应该这样做。基本上,您必须根据所有权来考虑指针。您的主要对象拥有该数组,并且您的数组拥有其中的每个Person。然而,与现实世界不同,所有权不是排他性的——另一个对象也可以拥有您的数组,而不会“稀释”您对它的所有权。您使用retainrelease 方法发出“获取”和“放弃”此类所有权的信号。当您的对象死亡时(即在dealloc),您必须确保它放弃它可能拥有的所有所有权。
    【解决方案2】:

    可能最简单和最“obj-c”的方法是在 person 上创建一个类方法来创建你想要的人。就像[NSString stringWithFormat] 一样,你会返回一个自动释放的对象,这样调用者甚至不需要释放它。

    永远不要自己打电话给dealloc - 相信release

    - (Person*) personWithName:(NSString*)name andAge:(NSNumber*)age
    {
         Person* p = [[Person alloc] init];
         p.name = name;
         p.age = age;
         [p autoRelease];
         return p;
    }
    

    现在您可以在一行中将每个人添加到数组中而不会泄漏内存

    [myArray addObject:[Person personWithName:@"Brian" andAge:23]];
    [myArray addObject:[Person personWithName:@"Alice" andAge:4]];
    [myArray addObject:[Person personWithName:@"Bob" andAge:60]];  
    

    延伸阅读:http://www.cocoadev.com/index.pl?AutoRelease

    【讨论】:

      【解决方案3】:

      正如 DHamrick 所写,您不应该 dealloc 您创建的对象,这与删除对象相同。它被添加到数组中,这也是retained 它。但是当您在循环中创建一个新对象时,我可以想象新对象将具有与先前删除的对象相同的地址,因此旧指针将再次指向这个新对象,让您相信它们都是同一个对象。为了寻找这样的错误,我建议你考虑启用 NSZombie's。

      http://iosdevelopertips.com/debugging/tracking-down-exc_bad_access-errors-with-nszombieenabled.html

      【讨论】:

        【解决方案4】:

        这是创建对象数组的方法 该对象是从字典中获取值,我在其中存储了对象以及键和值作为 EmpDesignation 类的对象..

        NSMutableDictionary *Dictperson = [[NSMutableDictionary alloc]init];
        
        [Dictperson setObject:FirstEmployee forKey:[NSNumber numberWithInt:1]];
        [Dictperson setObject:SecondEmployee forKey:[NSNumber numberWithInt:2]];
        NSNumber *count = [[NSNumber alloc]initWithInt:1];
        //   NSInteger temp = ;
        int cnt=Dictperson.count;
        EmpDesignation *obj[cnt];`
        

        【讨论】:

        • 这是什么编程语言?请提供一个可以理解的解释和一个准确的问题。到目前为止,我们无法在当前状态下解决这个问题。
        • 这是客观的,很抱歉出现并发症
        • 不用说对不起,毕竟你是在帮助这里的人。但我认为你应该更好地格式化你的代码。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-10-29
        • 2011-04-08
        • 1970-01-01
        • 2017-12-09
        • 2015-05-15
        • 2014-06-20
        相关资源
        最近更新 更多