0

我有一个财产(noARC)

@property (nonatomic, retain) NSString *itemUUID;

和初始化

- (void) viewDidAppear:(BOOL)animated
{
    [super viewDidAppear:animated];
    if (_itemUUID) {
        [self updateViews];
    } else {
       _itemUUID = [[EADataManager sharedInstance] generateUuidString];
        NSLog(@"%@", _itemUUID);
    }
}

UUID生成方法是

- (NSString *)generateUuidString
{
    CFUUIDRef UUID = CFUUIDCreate(kCFAllocatorDefault);
    NSString *uuidString = (NSString *)CFUUIDCreateString(kCFAllocatorDefault, UUID);
    [uuidString autorelease];
    CFRelease(UUID);
    return uuidString;
}

我尝试在另一种方法中以非常简单的方式使用此属性:

- (IBAction)submitButton:(id)sender
{
    if ([nameField.text length] > 3)
    {
        NSLog(@"%@", _itemUUID);
        NSDictionary *changedData = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:nameField.text, priceField.text, quantityField.text, nil] forKeys:[NSArray arrayWithObjects: @"Name", @"Price", @"Quantity", @"UUID", nil]];
    }
}

所以在第二个NSLog有一个例外BAD_ACCESS。无法理解我的错。

4

3 回答 3

2

generateUuidString正在返回一个autorelease值,因此您viewDidAppear应该保留它(您可以使用 setter 来完成self.itemUUID = ...)。

kambala 也是正确的,您还为字典的四个键添加了三个对象。

于 2013-09-26T12:46:28.053 回答
2

您忘记将 UUID 添加到字典中的对象列表中,因此对象和键的数量不匹配。正确的字典初始化:

NSDictionary *changedData = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:nameField.text, priceField.text, quantityField.text, _itemUUID, nil] forKeys:[NSArray arrayWithObjects: @"Name", @"Price", @"Quantity", @"UUID", nil]];
于 2013-09-26T12:47:01.720 回答
1

如果您不使用 ARC,则此

_itemUUID = [[EADataManager sharedInstance] generateUuidString];

是错误的,它将您不拥有的对象分配给实例变量。当自动释放池耗尽时,该对象将消失。既然你已经声明了一个属性,你应该使用它。

[self setItemUUID: [[EADataManager sharedInstance] generateUuidString]];
于 2013-09-26T12:48:42.080 回答