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 中很重要。self
在if (self)
行中是否非零?
@Rob Napier 是的,self 不为零。如果我在 if 中有一个断点,它就会中断。
@LordT 我打印了。你有什么想法吗?
【参考方案1】:
XCode 4.3 中有一个错误。即使变量视图或打印告诉您您的 iVar = 0x00000000 @"nil",但事实并非如此。如果您使用 NSLog(@"%@") 来回显您的 ivar,它将准确地显示您的内容。
【讨论】:
以上是关于iOS - 在指定的初始化程序中分配给 iVar 导致 nil iVar的主要内容,如果未能解决你的问题,请参考以下文章
无法在具有 MagicalRecord [核心数据] 的实体中分配给 ...