【问题标题】:iPhone - How to change String in Label properly?iPhone - 如何正确更改标签中的字符串?
【发布时间】: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


【解决方案1】:

我认为问题可能出在:

self.phoneNumber.text = number;

您将 self.phoneNumber.text 设置为与数字相同的字符串,而不是副本或具有相同内容的新创建的字符串。因此,在您的 addNum 方法中,一个属性的设置器在重置其值时释放字符串。第二个属性仍然指向释放的字符串。当调用第二个属性的 setter 时,它会再次尝试释放该字符串。因此,错误。

如果是这个问题,可以通过改写以下行来解决:

self.phoneNumber.text = @"";

虽然,即使这样也可能没有必要。所有实例变量都初始化为零,没有必要给它一个初始值。

【讨论】:

  • 我想越来越近了,但我仍然有同样的问题,我已经从我的代码中完全删除了 NSString 并将上面的行更改为您推荐的内容,我仍然有同样的问题,但看起来像出于某种原因,这是我的 UILabel 问题吗?但我仍然无法让它工作!
  • 两个 addNum 方法中的相同问题。尝试将第二行更改为: self.phoneNumber.text = [NSString stringWithString:self.number];
  • 再一次不高兴这样做,我的 addNum 函数代码如下: self.number = [self.number stringByAppendingString:@"1"]; self.phoneNumber.text = [NSString stringWithString:self.number];我仍然遇到同样的错误。
  • 是的,我看到了您的编辑。代码对我来说看起来不错。我没有主意了。回来希望你想通了。也许尝试让 NSZombie 在 Xcode 4 上工作。我帮不了你,我现在坚持使用 Xcode 3。 (我认为您正在点击构建并运行,而不仅仅是在您进行编辑后运行。我知道,非常基本,但这是使用新编辑器时可能会做的事情。)
【解决方案2】:

我猜你的 NSString 变量 number 导致了问题。您分配给该变量的值似乎不会保留在任何地方。当您使用 self 来访问变量 phoneNumber 时,您也需要使用它来访问 number。使用 self 调用实际保留属性的特定属性的设置器。

【讨论】:

  • 我刚刚尝试过,但我仍然遇到我担心的完全相同的问题,我已经编辑了上面的代码以向您展示我所做的更改
【解决方案3】:

我认为该属性可能还需要声明为 IBOutlet,如果是这样,这可能会导致问题。

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

【讨论】:

  • 刚刚将其添加到代码中,但没有任何区别,我仍然收到相同的错误。
  • 有道理,我认为这是必要的,但如果它导致错误,它应该在第一次访问 IBOutlet 时崩溃。见下文,另一个想法。
【解决方案4】:

看来你从不分配号码。 number的初始值是多少? 在我看来,您应该在 viewDidLoad 中分配一个字符串

【讨论】:

  • 我在 viewDidLoad 中这样做如下:self.number = @"";
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-13
  • 1970-01-01
  • 1970-01-01
  • 2021-11-05
  • 1970-01-01
  • 2011-08-30
  • 2016-08-16
相关资源
最近更新 更多