我目前正在学习在iPhone上编程。
我目前有一个小型测试应用程序,带有模拟键盘,所以我有一些按钮,按下时应该在标签上放置一些文字。
然后我在标签中查看了什么,并使用它打开一个ABUNKnownPersonControllerView供在那里使用。只是一个基本的应用程序,可以熟悉iPhone中的一些东西。
我遇到麻烦的地方似乎是使用用于在标签中显示我想要的字符串。我收到EXC_BAD_ACCESS错误,所以我重新阅读了内存管理文档,但我无法找到应该有内存泄漏的地方。
所以我认为我的问题是我错误地使用了String。我的代码如下:
//头文件
@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
// [号码发布]; //@合成 [super dealloc]; }
我尝试过使用Mutable字符串但是有相同的错误,我也尝试过不发布UILabel和NSString并且遇到同样的问题。
当我的应用程序加载时如果我按下一个按钮并且标签中出现一个字符,如果我然后使用showUnknowPersonViewController一切正常,如果我按下按钮1然后按下按钮2以便我知道在UILabel中有两个字符(“12”)然后选择使用showUnknownPersonViewcontroller然后我就崩溃了。
*** -[CFString release]: message sent to deallocated instance 0x1226a0
但是我不明白它可能会被解除分配?
这可能是我在教程中遗漏的基本内容,但是我无法弄明白,有人能看到我可能做错了吗?
编辑:只是要添加,如果self.phoneNumber.text(UILabel)返回空或一个字符,它可以正常工作,但是如果它的2个或更多我得到了崩溃。
编辑2 :我已完全从代码中删除了我的NSString,但我仍然遇到同样的问题,所以它看起来像是导致问题的UILabel?请参阅上面更改的代码。
答案 0 :(得分:4)
我认为问题可能在于:
self.phoneNumber.text = number;
您将self.phoneNumber.text设置为与数字相同的字符串,而不是复制或具有相同内容的新创建的字符串。因此,在addNum方法中,一个属性的setter在重置其值时释放该字符串。第二个属性仍然指向释放的字符串。当调用第二个属性的setter时,它会尝试再次释放该字符串。因此,错误。
如果这是问题,可以通过将行重写为:
来解决self.phoneNumber.text = @"";
虽然,即使这可能也没有必要。所有实例变量都被启动为nil,并且没有必要给它一个初始值。
答案 1 :(得分:1)
我猜你的 NSString 变量数字导致了这个问题。您分配给该变量的值似乎不会保留在任何位置。当您使用 self 访问变量 phoneNumber 时,您还需要使用它来访问号码。使用 self 调用实际保留属性的特定属性的setter。
答案 2 :(得分:1)
我认为该属性可能还需要声明为IBOutlet,如果是这样,那可能会导致问题。
@property (nonatomic, retain) IBOutlet UILabel *phoneNumber;
答案 3 :(得分:1)
似乎你永远不会分配号码。数字的初始值是多少? 在我看来,你应该在viewDidLoad
中分配一个字符串