【发布时间】:2011-08-30 18:28:13
【问题描述】:
我目前正在学习在 iPhone 上编程。
我目前有一个带有模拟键盘的小型测试应用程序,所以我有几个按钮,按下时应该在标签中放置一些文本。
然后我获取标签中的内容并使用它打开 ABUNKnownPersonControllerView 以供在那里使用。只是一个基本的应用程序来适应 iPhone 中的一些事情。
我遇到问题的地方似乎是使用用于在标签中显示我想要的内容的字符串。我收到 EXC_BAD_ACCESS 错误,所以我重新阅读了内存管理文档,但我找不到任何应该存在内存泄漏的地方。
所以我认为我的问题是我错误地使用了字符串。我的代码如下:
//头文件
@interface KeyPadViewController : UIViewController <ABUnknownPersonViewControllerDelegate>{
IBOutlet UILabel *phoneNumber;
//NSString *number;
}
@property (nonatomic, retain) UILabel *phoneNumber;
//@property (nonatomic, retain) NSString *number;
-(IBAction)addNum1;
-(IBAction)addNum2;
-(IBAction)showUnknownPersonViewController;
//实现文件
- (void)viewDidLoad
{
[super viewDidLoad];
self.title = NSLocalizedString(@"Keypad",@"Keypad");
//self.number = @"";
self.phoneNumber.text = @"";
}
-(IBAction)addNum1{
//self.number = [self.number stringByAppendingString:@"1"];
self.phoneNumber.text = [self.phoneNumber.text stringByAppendingString:@"1"];
}
-(IBAction)addNum2{
//self.number = [self.number stringByAppendingString:@"2"];
self.phoneNumber.text = [self.phoneNumber.text stringByAppendingString:@"2"];
}
以及实现文件中的showUnknownPerson视图:
-(void)showUnknownPersonViewController
{
//NSString *contactNum = self.phoneNumber.text;
ABRecordRef aContact = ABPersonCreate();
CFErrorRef anError = NULL;
ABMultiValueRef email = ABMultiValueCreateMutable(kABPersonPhoneProperty);
bool didAdd = ABMultiValueAddValueAndLabel(email, self.phoneNumber.text, kABPersonPhoneMobileLabel, NULL);
if (didAdd == YES)
{
ABRecordSetValue(aContact, kABPersonPhoneProperty, email, &anError);
if (anError == NULL)
{
ABUnknownPersonViewController *picker = [[ABUnknownPersonViewController alloc] init];
picker.unknownPersonViewDelegate = self;
picker.displayedPerson = aContact;
picker.allowsAddingToAddressBook = YES;
picker.allowsActions = YES;
[self.navigationController pushViewController:picker animated:YES];
[picker release];
}
else
{
UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Error"
message:@"Could not create unknown user"
delegate:nil
cancelButtonTitle:@"Cancel"
otherButtonTitles:nil];
[alert show];
[alert release];
}
}
CFRelease(email);
CFRelease(aContact);
}
还有dealloc:
- (void)dealloc
{
[phoneNumber release]; //@synthesize
// [号码发布]; //@合成 [超级释放]; }
我尝试过使用可变字符串但有同样的错误,我也尝试过不释放 UILabel 和 NSString 并且有同样的问题。
当我按下一个按钮并且标签中出现一个字符时,当我的应用程序加载时,如果我然后使用 showUnknowPersonViewController 一切正常,如果我按下按钮 1 然后按下按钮 2 以便我知道 UILabel 中有两个字符("12") 并选择使用 showUnknownPersonViewcontroller 然后我得到了崩溃。
*** -[CFString release]: message sent to deallocated instance 0x1226a0
但是我不明白它可能在哪里被释放?
这可能是我在教程中错过的基本内容,但我无法弄清楚,谁能看到我可能做错了什么?
编辑:只是添加如果 self.phoneNumber.text (UILabel) 返回空字符或一个字符,它可以正常工作,但是如果它的 2 个或更多,我会崩溃。
编辑 2:我已经从代码中完全删除了我的 NSString,但我仍然遇到同样的问题,所以它看起来像是导致问题的 UILabel?请参阅上面更改的代码。
【问题讨论】:
-
你不知道崩溃出现的路线吗?尝试启用 NSZombieEnabled,看看它是否能让你更进一步!
-
@Joetjah,我已将 NSZombieEnabled 添加到调试器中,但我使用的是 Xcode 4,但我似乎无法让它向我显示崩溃的行,当我运行它时,它总是鞋我这一行: int retVal = UIApplicationMain(argc, argv, nil, nil);
标签: iphone objective-c ios nsstring