iOS - 在指定的初始化程序中分配给 iVar 导致 nil iVar

Posted

技术标签:

【中文标题】iOS - 在指定的初始化程序中分配给 iVar 导致 nil iVar【英文标题】:iOS - Assigning to an iVar in the designated initializer result in a nil iVar 【发布时间】:2012-03-06 17:11:33 【问题描述】:

我面临一个非常奇怪的问题。 假设我有 UIViewController 的子类和它的初始化程序:

- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
managedObjectContext:(NSManagedObjectContext *)context

    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) 
        // Custom initialization
        self.managedObjectContext = context;
    
    return self;

这是我声明 self.managedObjectContext 的方式:

@interface identificationViewController ()
@property (retain, nonatomic) NSManagedObjectContext *managedObjectContext;
//...
@end

然后合成

@synthesize managedObjectContext = _managedObjectContext;

最后在 AppDelegate 中我这样做了:

identificationViewController *identificationVC = [[identificationViewController 
alloc]    initWithNibName:@"identificationViewController" bundle:nil     
managedObjectContext:self.managedObjectContext];

self.window.rootViewController = identificationVC;
[identificationVC release];

当我在 IdentificationViewController 中调试“init..”时,参数上下文与 nil 不同,但在 = 之后,self.managedObjectContext 仍然等于 nil !!

我不明白为什么。你有什么想法吗?

提前致谢。

编辑:我在 .m 中声明了 managedObjectContext 而不是 .h

【问题讨论】:

要确定它是否为空,您是在 gdb 中打印出来的,还是只是查看调试器中的值?我们发现更新值通常需要一些时间 - 在 gdb 中“po”它们会更好(右键单击变量并“打印描述”将完成这项工作) 一定要大写你的类。命名和大小写在 Cocoa 中很重要。 selfif (self) 行中是否非零? @Rob Napier 是的,self 不为零。如果我在 if 中有一个断点,它就会中断。 @LordT 我打印了。你有什么想法吗? 【参考方案1】:

XCode 4.3 中有一个错误。即使变量视图或打印告诉您您的 iVar = 0x00000000 @"nil",但事实并非如此。如果您使用 NSLog(@"%@") 来回显您的 ivar,它将准确地显示您的内容。

【讨论】:

以上是关于iOS - 在指定的初始化程序中分配给 iVar 导致 nil iVar的主要内容,如果未能解决你的问题,请参考以下文章

无法在具有 MagicalRecord [核心数据] 的实体中分配给 ...

表视图控制器在弹出窗口中分配给 contentViewController 属性时不显示数据

在php中分配给关联数组切片

laravel 如何在多对多关系中分配给用户?

Liferay 资产发布者条目变量在 adt 中分配给自身

从新分配的内存中分配给对象