【问题标题】:Duplicate a variable with different memory address复制具有不同内存地址的变量
【发布时间】:2023-03-03 02:53:01
【问题描述】:

我正在尝试创建一个变量的新实例,其中包含另一个变量的相同属性值。

我不能像在下面的代码中那样直接分配它们,因为在这种情况下它们都将指向同一个内存地址。

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
      UITextField * newTextField = [UITextField new];

      newTextField = textField; // the problem goes here ( same memory address )

      [self.view addSubview:newTextField];
      [textField resignFirstResponder];
      [textField removeFromSuperview];
}

我想出了一个不切实际的方法来设置每个属性。

- (BOOL)textFieldShouldReturn:(UITextField *)textField {
     UITextField * newTextField = [[UITextField alloc] initWithFrame:textField.frame];
        newTextField.font = textField.font;
        newTextField.text = textField.text;
        newTextField.textColor = textField.textColor;
        newTextField.textAlignment = textField.textAlignment;
        newTextField.center = textField.center;
        // ...
        // ...
}

但在这种情况下,我必须将每个单独的属性设置为新实例,我认为这不切实际。

难道没有更好的方法可以在不改变新变量的内存地址的情况下将旧变量设置为新变量吗?

【问题讨论】:

  • UITextField 是否符合NSCopying 协议?
  • 我猜您需要将textField 定义为@property (nonatomic, copy) UITextField * textField; 之类的属性,然后当您尝试将其分配给另一个指针时,它将复制您的初始文本字段对象。这里有一些解释stackoverflow.com/questions/10524772/…
  • 你为什么要这样做?用另一个相同的文本字段替换文本字段的目的是什么?
  • newTextField = textField 绝对是个问题;这只是将newTextField 设置为指向textField 指向的任何内容。它与int x = 1; int y; y = x; 相同。您的“不切实际”的方法实际上是唯一的方法。但是……你到底想做什么?这样的模式很奇怪。
  • @user3607093 为什么不直接从原始层次结构中删除视图并将其直接推入另一个层次结构?仍然有点奇怪,但实际上并非闻所未闻。

标签: ios objective-c variables pointers memory-management


【解决方案1】:

为此,您必须继承 UITextField 并让您的子类符合 NSCopying 协议,为此您必须在 UITextField 子类中实现方法 copyWithZone。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-08-06
    • 1970-01-01
    • 1970-01-01
    • 2014-04-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多