2011-04-15 87 views
0

我目前正在學習在iPhone上編程。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 

// [數字發佈]; // @合成 [super dealloc]; }

我試過使用可變字符串,但有相同的錯誤,我也試過不釋放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

難道你不知道崩潰外觀的線?嘗試啓用NSZombieEnabled,看看它是否讓你更進一步! – Joetjah 2011-04-15 10:04:29

+0

@Joetjah,我已經添加NSZombieEnabled調試器,但我使用Xcode 4,我似乎無法讓它工作,告訴我它崩潰的行,當我運行它,它總是鞋我這一行:int retVal = UIApplicationMain(argc,argv,nil,nil); – 2011-04-15 10:21:47

回答

4

我覺得問題可能出在線路:

self.phoneNumber.text = number; 

要設置self.phoneNumber.text相同的字符串爲數字,不復制到具有相同內容的新創建的字符串。因此,在addNum方法中,一個屬性的setter在重置其值時釋放該字符串。第二個屬性仍然指向釋放的字符串。當調用第二個屬性的setter時,它會嘗試再次釋放該字符串。因此,錯誤。

如果是這樣的問題,可以通過重寫線解決:

self.phoneNumber.text = @""; 

雖然,即使這可能是沒有必要的。所有實例變量都被初始化爲零,並且不需要給它一個初始值。

+0

越來越近我認爲,但我仍然有同樣的問題,我完全從我的代碼中刪除了NSString,並將上面的行更改爲您推薦的內容,但仍然存在相同的問題,但它看起來像是我的UILabel,它是問題出於某種原因?但我仍然無法讓它工作! – 2011-04-15 11:24:00

+0

addNum方法中存在同樣的問題。嘗試將第二行更改爲:self.phoneNumber.text = [NSString stringWithString:self.number]; – 2011-04-15 11:30:06

+0

再次沒有喜歡這樣做,用我的代碼爲addNum函數,如下所示:self.number = [self.number stringByAppendingString:@「1」]; self.phoneNumber.text = [NSString stringWithString:self.number];我仍然得到同樣的錯誤。 – 2011-04-15 12:12:11

1

我猜你的NSString變量number是造成這個問題。看起來你分配給這個變量的值不會被保留在任何地方。由於您正在使用self訪問變量phoneNumber,因此您還需要使用它訪問號碼。使用self爲該屬性實際保留的特定屬性調用setter。

+0

我剛剛嘗試過,但我仍然得到了我害怕的完全相同的問題,我已經編輯了上面的代碼以向您展示我已更改的代碼 – 2011-04-15 09:58:04

1

我認爲該屬性可能還需要聲明爲IBOutlet,如果是,則可能導致問題。

@property (nonatomic, retain) IBOutlet UILabel *phoneNumber; 
+0

剛纔添加到代碼中,但它沒有區別,我我仍然收到同樣的錯誤。 – 2011-04-15 10:31:37

+0

有道理,我認爲這是必要的,但如果它導致錯誤,它應該在第一次訪問IBOutlet時崩潰。看下面,另一個想法。 – 2011-04-15 11:11:08

1

看來你永遠不會分配數量。號碼的初始值是多少? 在我看來,你應該在你的viewDidLoad分配一個字符串

+0

我在viewDidLoad中做如下:self.number = @「」; – 2011-04-15 10:30:51