指针和引用

时间:2012-04-09 10:34:50

标签: iphone objective-c ios

我有一个名为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");
}  

2 个答案:

答案 0 :(得分:1)

是。一定是零。 因为你改变了对象!

执行myAppDelegate.provisoryRegion=[[Region alloc]init]; myAppDelegate.provisoryRegion指向新对象(堆上的新地址)时。

*region关注新地址!

因此*region仍然指向NULL地址。

但为什么要在第1行复制你的指针? 为什么不总是使用myAppDelegate.provisoryRegion*regionmyAppDelegate.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时,它仍然是零。