【问题标题】:Obj-C object is nullObj-C 对象为空
【发布时间】:2014-08-30 20:43:56
【问题描述】:

在我的 iOS 应用程序中,我的 AddPersonViewController 类中有“Person”类的前向声明,如下所示。

@protocol PersonAddDelegate;
@class Person;
@interface AddPersonViewController : UIViewController

@property (nonatomic, unsafe_unretained) id <PersonAddDelegate> delegate;
@property (nonatomic, strong) Person * person;

@end

@protocol PersonAddDelegate <NSObject>

- (void)AddPersonViewController:(AddPersonViewController *)addPersonViewController didAddPerson:(Person *)person;

@end

但是当我尝试从代码中调用 person 对象时,我注意到 person 是 nil 即使 self.nameTextField.text 按预期返回字符串:

self.person.personname = self.nameTextField.text;

我猜这是关于初始化“人”,但我不确定。关于问题和解决方案的任何想法?提前谢谢你

【问题讨论】:

  • 这与前向声明有什么关系?似乎问题在于您创建了一个Person 对象并将其分配给person 属性。

标签: objective-c forward-declaration


【解决方案1】:

使用@property 获得支持iVar _person,以及person getter 方法和setPerson setter 方法,但您没有获得Person 对象。默认情况下它是 nil 并且是设计的。如果你希望它是非 nil,你应该在类的 init 方法中初始化它。

@implementation AddPersonViewController
-(id)init {
    if ( self = [super init] ) {
        _person = [[Person alloc] init];
    }
    return self;
}

【讨论】:

  • 请记住,在 Objective-C 中,您可以向未启动的对象发送消息,并且不会收到错误消息。我用来解决这些情况的一个好习惯是if (object) NSLog(@"something");
  • 您好,感谢您的回答。然而,即使我添加了建议的初始化,我仍然有同样的问题。 Morover,当我在你提出的 if 语句中设置断点时,我注意到它没有被命中。
  • 你的视图控制器子类永远不会被使用。这通常与 XCode 中 InterfaceBuilder 中 VC 对象的“自定义类”与您的 VC 类不匹配有关。如果您尝试以编程方式加载 VC,则需要发布有关该问题的代码。
猜你喜欢
  • 1970-01-01
  • 2014-03-24
  • 1970-01-01
  • 2012-10-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-03
相关资源
最近更新 更多