使用一组类填充NSMutableArray然后将它们取回

时间:2010-08-24 00:21:35

标签: iphone nsmutablearray

希望我能说清楚这一点,但我是Objective-C的新手,说实话并不是最好的阵列。

所以,我有一个Singleton类(称为SingletonState),我用来在我的应用程序周围传递变量(我们可以留下我是否应该使用Singleton类 - 我稍后会修复它)。在这个类中,我有一个NSMutableArray(称为arrayMyEvents)。我还创建了一个类,我将存储一个事件列表(称为EventClass)。当用户登录时,我调用Web服务并返回3个字符串。第3个字符串是逗号分隔的值列表。我解析数据并填充自定义类EventClass。然后我将此类添加到SingletonState.arrayMyEvents。

我完成了所有这些工作。我可以转到另一个ViewController并访问arrayMyEvents中项目的“count”。

问题:我现在想在我的数组中编辑一个ScheduledEventsClass“es”。如何访问它并编辑一些属性并更新我的SingletonState类中的属性?

以下是我尝试过的一些代码:

NSString *sWebServiceEvents = [[NSString alloc] initWithFormat:@"%@", [result objectAtIndex:2]];

            if ( [ sWebServiceEvents isEqualToString:@"NULL" ] != true ) {

                NSArray *arrayEvents = [sWebServiceEvents componentsSeparatedByString:@","];

                // If the array has not been initialized they initialize it.
                if (sharedState.arrayMyEvents == nil) {
                    sharedState.arrayMyEvents = [[NSMutableArray alloc ] init ];
                }


                for (NSString * sEvent in arrayEvents) {
                    // Set equal to the value of the array (the Event Number) at the same
                    // position as the row that we are being asked to return a cell/row for.
                    EventClass *eventClass = [[EventClass alloc] retain];

                    eventClass.sEvent = sEvent;

                    [ sharedState.arrayEvents addObject:eventClass ];

                }

                NSLog(@"LoginView - sharedState.arrayMyEvents Count: %d", [sharedState.arrayMyEvents count]);
            }

我试图在另一个ViewController中访问它:

EventClass *eventClass =
[sharedState.arrayMyEvents objectAtIndex:row ];
NSLog(@"eventClass.sEventNumber: ", eventClass.sEventNumber);
eventClass.sLocation = @"Jason's Big Location";

3 个答案:

答案 0 :(得分:1)

您将从sEvent循环中获得一些内存泄漏。 [[EventClass alloc]retain]会为您留下未初始化的EventClass对象,其引用次数为2.您需要将其更改为[[[EventClass alloc] init] autorelease]以防止泄漏。 arrayEvents NSMutableArray将在addObject:call期间保留它。 (不应该是循环中的[sharedState。 arrayMyEvents addObject:eventClass]吗?)

之后,在第二个代码块中编辑EventClass对象所需要做的就是编辑它。 eventClass变量是指向数组中对象的指针。对该对象所做的任何操作都不会影响引用它的指针,它会影响它引用的数据。您在第二个块中的代码应该按照您的意愿更改所选对象的sLocation。

你也有更多的内存泄漏。使用Cmd-Shift-A与静态分析器一起构建,它会告诉你在哪里。

答案 1 :(得分:0)

也许问题在于您将它们放在sharedState.arrayEvents中,但是尝试将它们从sharedState.arrayMyEvents中删除。不同的变量。

此外,还有大量内存泄漏。

答案 2 :(得分:0)

感谢John和St3fan,感谢您的回答和时间!!!

我认为我发现了我的问题:

基本上,我创建的类(EventClass)具有如下设置的属性:

@property (nonatomic, assign) NSString *sStudyNumber;   
@property (nonatomic, assign) NSString *sTheater;

但是,他们应该(或者至少我让它像这样工作):

@property (nonatomic, retain) NSString *sStudyNumber;   
@property (nonatomic, retain) NSString *sTheater;

然后,在我的第二个视图中,我能够做到这一点:

EventClass *eventClass = [sharedState.arrayMyEvents objectAtIndex:row ];
NSLog(@"MyEvents: %@", eventClass.sEventNumber);
    eventClass.sLocation = @"Jason's Big Location";

然后我使用它在另一个视图方法中检查它,它仍然存在:

EventClass *eventClass = [sharedState.arrayMyEvents objectAtIndex:row ];
NSLog(@"MyEvents: %@", eventClass.sEventNumber);
NSLog(@"MyEvents: %@", eventClass.sLocation);

我也在另一个视图中检查了它,并且该值在SharedState.arrayMyEvents中保持不变。 :)

最后,我相信我归结为“分配”和“保留”之间的区别。

现在,关于内存泄漏:(

如果您发现任何其他问题,请告诉我。

谢谢, 杰森