我有一个属性(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
。无法理解我的错。
答案 0 :(得分:2)
您的generateUuidString
返回autorelease
值,因此您的viewDidAppear
应保留该值(您可以使用设置器self.itemUUID = ...
进行保留)。
kambala也是正确的,你还为你的字典的四个键添加了三个对象。
答案 1 :(得分:2)
您忘记将UUID添加到字典中的对象列表中,因此对象和键的数量不匹配。正确的字典初始化:
NSDictionary *changedData = [NSDictionary dictionaryWithObjects:[NSArray arrayWithObjects:nameField.text, priceField.text, quantityField.text, _itemUUID, nil] forKeys:[NSArray arrayWithObjects: @"Name", @"Price", @"Quantity", @"UUID", nil]];
答案 2 :(得分:1)
如果您不使用ARC,请
_itemUUID = [[EADataManager sharedInstance] generateUuidString];
错误,它将您不拥有的对象分配给实例变量。当自动释放池耗尽时,该对象将消失。由于您已声明属性,因此应使用它。
[self setItemUUID: [[EADataManager sharedInstance] generateUuidString]];