我有一个名为Region的服装类,我正在使用这段代码初始化区域变量怎么可能在这段代码的末尾myAppDelegate.provisoryRegion不是nil而region是nil ???是不是myAppDelegate.provisoryRegion通过引用传递给区域??? 我完全确定在这段代码的末尾区域是零。
Region *region=myAppDelegate.provisoryRegion;
if (!myAppDelegate.provisoryRegion) {
myAppDelegate.provisoryRegion=[[Region alloc]init];
}
if (!region){ NSLog(@"region is nil");
}
答案 0 :(得分:1)
是。一定是零。 因为你改变了对象!
执行myAppDelegate.provisoryRegion=[[Region alloc]init];
myAppDelegate.provisoryRegion指向新对象(堆上的新地址)时。
*region
将不关注新地址!
因此*region
仍然指向NULL
地址。
但为什么要在第1行复制你的指针?
为什么不总是使用myAppDelegate.provisoryRegion
。 *region
是myAppDelegate.provisoryRegion
在示例 - 虚拟代码中最后执行操作并删除第1行:
if (!myAppDelegate.provisoryRegion){ NSLog(@"region is nil");
}
顺便说一句......
myAppDelegate.provisoryRegion=[[Region alloc]init];
看起来像是内存泄漏(如果你的@property设置为保留)。
修复:
myAppDelegate.provisoryRegion=[[[Region alloc] init] autorelease];
答案 1 :(得分:1)
region
是一个包含内存地址的变量。 myAppDelegate.provisoryRegion
是包含内存地址的另一个变量。
代码的第一行myAppDelegate.provisoryRegion
包含nil的内存地址,然后将其复制到region
,即region
还包含内存地址nil, NOT < / strong> myAppDelegate.provisoryRegion
的内存地址。
接下来,测试myAppDelegate.provisoryRegion
是否为nil,然后将myAppDelegate.provisoryRegion
的内容设置为新Region
实例的内存地址。
region是一个完全不同的变量,仍然包含nil的内存地址。所以,最后当你测试region
时,它仍然是零。