0

我有一个名为 Region 的服装类,我正在使用这段代码来初始化 region 变量,这怎么可能在这段代码的末尾 myAppDelegate.provisoryRegion 不是 nil 而 region 是 nil?myAppDelegate.provisoryRegion 不是通过引用传递给 region 吗???我 100% 确定该区域在这段代码的末尾为零。

Region *region=myAppDelegate.provisoryRegion;
if (!myAppDelegate.provisoryRegion) {
    myAppDelegate.provisoryRegion=[[Region alloc]init];
}
if (!region){ NSLog(@"region is nil");
}  
4

2 回答 2

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];
于 2012-04-09T10:40:33.457 回答
1

region是一个包含内存地址的变量。 myAppDelegate.provisoryRegion是一个包含内存地址的不同变量。

代码的第一行myAppDelegate.provisoryRegion包含 nil 的内存地址,然后将其复制到region,即region还包含 nil 的内存地址,而不是的内存地址myAppDelegate.provisoryRegion

接下来测试 if 是否myAppDelegate.provisoryRegion为 nil,它是,然后将内容设置myAppDelegate.provisoryRegion为新Region实例的内存地址。

region 是一个完全不同的变量,它仍然包含 nil 的内存地址。所以,最后当你测试region它仍然是零。

于 2012-04-09T10:41:20.600 回答