在case语句中创建的NSString的生命周期

时间:2013-01-16 14:49:28

标签: ios core-data switch-statement

我有一个iOS程序,使用ARC使用Core Data支持DynamoDB。

在其中我有一个数据模型,声明了以下类:

#import <Foundation/Foundation.h>
#import <CoreData/CoreData.h>


@interface Track : NSManagedObject

@property (nonatomic, retain) NSString * trackId;

@end

-------------------------------------------------

#import "Track.h"


@implementation Track

@dynamic trackId;

@end

然后我创建了一个类来创建ManagedObject的实例并像这样持久化它:

NSString *trackId = @"ABC123";

Track *track = (Track*)[NSEntityDescription insertNewObjectForEntityForName:@"Track" inManagedObjectContext:context];
track.trackId=trackId;

NSError *error;
if (![appDelegate.managedObjectContext save:&error])
{
    NSLog(@"error: %@", error);
}

这可以按预期工作。但是,如果我使用开关实现相同的操作来改变trackId的值,如下所示:

for (int i=0; i<1; i++) {
    NSString *trackId;
    switch (i) {
        case 0:
            trackId = @"XYZ789";
            break;
    }

    Track *track = (Track*)[NSEntityDescription insertNewObjectForEntityForName:@"Track" inManagedObjectContext:context];
    track.trackId=trackId;
}

NSError *error;
if (![appDelegate.managedObjectContext save:&error])
{
    NSLog(@"error: %@", error);
}

然后我得到以下异常:

2013-01-16 14:44:00.013 DjTest2[2351:c07] XYZ789
2013-01-16 14:44:00.014 DjTest2[2351:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '*** setObjectForKey: key cannot be nil'
*** First throw call stack:
(0x183e012 0x1663e7e 0x18c10de 0x107c9bf 0x39799 0x1ff5e4 0xc7831 0xf533c 0x3411 0x68c817 0x68c882 0x5dba25 0x5dbdbf 0x5dbf55 0x5e4f67 0x5a8fcc 0x5a9fab 0x5bb315 0x5bc24b 0x5adcf8 0x268bdf9 0x268bad0 0x17b3bf5 0x17b3962 0x17e4bb6 0x17e3f44 0x17e3e1b 0x5a97da 0x5ab65c 0x258d 0x24b5)
libc++abi.dylib: terminate called throwing an exception

我假设有一些问题我不知道使用ARC的变量范围/保留,其中NSString文字在交换机的范围内创建,但我找不到任何对它的引用。

有谁知道导致这种情况的根本原因是什么以及如何在不能执行此类操作的情况下有效处理持久化大量对象?

注意:我已经提到支持DynamoDB的完整性,但是在尝试调用AWS之前会引发此异常。

1 个答案:

答案 0 :(得分:0)

我担心我的上面的代码示例让我误入歧途,在进入SO时我更新了清晰度。

实际问题不在于它是在switch语句中,而是我正在使用的一些真正的键在它们中有空格,然后我假设它被Core Data限制,因为DynamoDB没有这样的限制。 / p>