self总是在viewController的方法

时间:2016-01-20 21:04:30

标签: ios uiviewcontroller ios9

出于某种原因,我遇到了一个问题,在viewController的代码内部(在调用viewDidLoad方法之后运行良好),self总是返回nil。 (使用iOS 9.2.1在iPad Air上运行,以9.2为目标构建的应用程序。)

在初始化代码中,我们有一个普通的启动器:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    };

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) { }
    return self;
}

viewController实例化如下:

myVC * myVC = [[myVC alloc] initWithNibName:nil bundle:nil];

myVC类和.xib文件的名称相同。

有一个名为:

的财产
@property (weak, nonatomic) IBOutlet UILabel *ipAddressLabel;

在myVC内部的方法中,我有一个这样的方法:

- (void) networkPropertiesDidChange:(NSDictionary *)properties {
    void (^completionBlock)(UIAlertAction *) = ^(UIAlertAction *action) {
        [self.serialNumberField setEnabled:false];
    };
    if([properties[@"result" isEqualToString @"error"]) {
        [Utility showBasicAlertControllerWithText:@"Device not registered." completionBlock:completionBlock sender:self];
        return;
    }
    else if ([properties[@"result"] isEqualToString @"ipChange"]) {
        NSString *newAddy = [[NSString alloc] initWithString:properties[@"ipAddress"]];
        self.ipAddressLabel.text = newAddy;
        return;
    } 
    else return;
}

然而,地址标签只是空白。

当我执行代码时,在初始化newAddy的行上,self不是nil,而ipAddressLabel不是nil。但是当运行时命中self.ipAddressLabel.text时,它会通过initWithNibName,并为self返回 nil !然后将ipAddressLabel设置为nil,然后在视图上变为空白。

此时myVC已经成功加载并且在屏幕上。所以我无法理解为什么自我在这种方法中为自己回归为零......这很奇怪。

如果我删除了我对initWithNibName方法的覆盖,那么一切都完美无缺。如果我在设置self = [super ...]之前检查initWithNib名称的开头是否(se​​lf!= nil),那么视图将绘制大约1"屏幕太低而被切断。

试着理解为什么会这样。感谢。

1 个答案:

答案 0 :(得分:0)

问题在于:

void (^completionBlock)(UIAlertAction *) = ^(UIAlertAction *action) {
    [self.serialNumberField setEnabled:false];
};

它需要弱自我...

    __weak typeof(self) weakSelf = self;
    void (^completionBlock)(UIAlertAction *) = ^(UIAlertAction *action) {
        [weakSelf.paxSerialNumberField setEnabled:false];
    };

不要问我原因,我的大脑爆炸了。