gpt4 book ai didi

ios - 当充满地址簿信息的 UITableView 向下滚动时,应用程序崩溃

转载 作者:行者123 更新时间:2023-11-29 02:52:07 26 4
gpt4 key购买 nike

我正在尝试在我的应用程序中实现一项功能,该功能要求我显示用户手机中包含电子邮件的所有联系人。

我成功地从Address Book框架中检索了相关联系人,并将信息保存在一个数组中。每个联系人都被包装在包含 2 个属性的包装器中:fullNameemail,它们都是 NSStrings

现在我已经在 View Controller 的表格中填充了联系人数组,当表格处于静态且没有任何用户触摸或滚动时,一切都很棒,生活也很棒!但是当我向下滚动以显示更多联系人时,我崩溃了!

崩溃

没有日志转储到控制台。我在 tableView:cellForRowAtIndexPath: 中的某一行上有绿线(与使用调试器断点时相同),内容如下:Thread 1: EXC_BAD_ACCESS (code=1, address=0x10d9eb4e )

我的调查

我对联系人数组有很强的引用。我检查了那个数组的内容。并注意到用户可见的所有项目(即大约 11 个项目)都是绝对有效的。所有字段都与预期数据(全名和电子邮件)正确。

另一方面,数组中的其余项目似乎已损坏或其他原因。我可以看到这些项目属于 NRContactInfo 类型,它有 2 个属性:_fullName_email - 但即使这 2 个属性的类型properties是NSString,内容不是字符串,而是内存地址什么的(比如:0x114e2b3b0)。

我注意到崩溃第一次发生在 tableView:cellForRowAtIndexPath: 中,我在其中调用了一个 NRContactInfo 属性,所以如果我从 tableView:cellForRowAtIndexPath: 中删除对 NRContactInfo 属性的所有调用并仅使用虚拟信息,那么一切都很好。

所以我认为这与丢失从地址簿中检索到的信息有关。但我不知道为什么或如何解决它。

我的一些助手代码(已编辑)

更新

为了清晰起见,我删除了代码中一些未连接/不必要的部分。我添加了 NRContactInfo 类的实现。

这里是 tableView:cellForRowAtIndexPath: 方法的代码片段,正如我上面所解释的那样崩溃了。

- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
static NSString *cellIdentifier = @"tableCell";
UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:cellIdentifier];

if (cell == nil){
cell = [[UITableViewCell alloc] initWithStyle:UITableViewCellStyleSubtitle reuseIdentifier:cellIdentifier];
}

NRContactInfo *contact = contacts[indexPath.row];

cell.textLabel.text = contact.fullName; // <------ CRASHES HERE!
cell.detailTextLabel.text = contact.email;

return cell;
}

在此先感谢您提供的每条信息,这些信息可以帮助我解决此问题!

更新

我在这里发布了从 AddressBook 检索联系人信息并创建 NRContactsInfo 对象的代码,正如 Volker Voecking 在他的评论中指出的那样:

- (void)getPersonsOutOfAddressBook
{
//In case of an error we create an error object.
CFErrorRef error = NULL;
//We get a reference to the user's address book.
ABAddressBookRef addressBook = ABAddressBookCreateWithOptions(NULL, &error);
if ([self checkForPermmissionsToAccessAddressBook:addressBook]){
if (addressBook != nil) {
NSLog(@"Succesful.");

//we copy all contacts from the addressbook in an array
NSArray *allContacts = (__bridge_transfer NSArray *)ABAddressBookCopyArrayOfAllPeople(addressBook);

//We loop through the contacts in the address book. For each contact, we create a NRContactInfo Object.
NSUInteger i = 0; for (i = 0; i < [allContacts count]; i++)
{
ABRecordRef contactPerson = (__bridge ABRecordRef)allContacts[i];

NSString *firstName = (__bridge_transfer NSString *)ABRecordCopyValue(contactPerson, kABPersonFirstNameProperty);
NSString *lastName = (__bridge_transfer NSString *)ABRecordCopyValue(contactPerson, kABPersonLastNameProperty);
NSString *fullName = @"";
if (firstName) {
fullName = [fullName stringByAppendingString:firstName];
}
if (lastName) {
fullName = [fullName stringByAppendingString:@" "];
fullName = [fullName stringByAppendingString:lastName];
}
NSString *email;

//The email property of the addressbook is assigned to a multivalue reference
ABMultiValueRef emails = ABRecordCopyValue(contactPerson, kABPersonEmailProperty);

if (ABMultiValueGetCount(emails)>0){
NSUInteger j = 0;
for (j = 0; j < ABMultiValueGetCount(emails); j++) {
email = (__bridge_transfer NSString *)ABMultiValueCopyValueAtIndex(emails, j);
NRContactInfo *contact =[NRContactInfo initWithFullName:fullName Email:email];
if (contact.isValid)
[_contacts addObject:contact];
}
}
}
CFRelease(addressBook);
} else {

NSLog(@"Error reading Address Book: %@", error);
}
}

}

- (BOOL)checkForPermmissionsToAccessAddressBook:(ABAddressBookRef) addressBook
{
__block BOOL userDidGrantAddressBookAccess = NO;

if ( ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusNotDetermined ||
ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusAuthorized ) {
ABAddressBookRequestAccessWithCompletion(addressBook, ^(bool granted, CFErrorRef error){
userDidGrantAddressBookAccess = granted;
});
}
else {
if ( ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusDenied ||
ABAddressBookGetAuthorizationStatus() == kABAuthorizationStatusRestricted ) {
// Display an error.
}
}
return userDidGrantAddressBookAccess;
}

NRContactInfo 的实现:

+ (NRContactInfo *)initWithFullName:(NSString *)fullName Email:(NSString *)email
{
NRContactInfo *contact = [NRContactInfo new];

contact.fullName = [NSString stringWithFormat:@"%@", fullName];
contact.email = [NSString stringWithFormat:@"%@", email];

return contact;
}

- (BOOL)isValid
{
if (_fullName &&_email)
return YES;
return NO;
}

最佳答案

在编辑我的答案以使其更准确并包含有关我的问题的更多信息时,我注意到了问题的根源:

在我的 NRContactInfo 类中,我有 2 个声明如下的属性:

@property (nonatomic, assign) NSString *fullName;
@property (nonatomic, assign) NSString *email;

这就是奇怪的崩溃的原因。显然,即使我确信我有对这些属性的有效引用,但我没有!

这就是解决我的问题的方法:

@property (nonatomic, retain) NSString *fullName;
@property (nonatomic, retain) NSString *email;

感谢所有帮助者,其余的请注意复制和粘贴 sin :D

关于ios - 当充满地址簿信息的 UITableView 向下滚动时,应用程序崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24371236/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com