希望我能说清楚这一点,但我是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";
答案 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中保持不变。 :)
最后,我相信我归结为“分配”和“保留”之间的区别。
现在,关于内存泄漏:(
如果您发现任何其他问题,请告诉我。
谢谢, 杰森