各位好,我刚学iphone,关于内存管理,看了一篇文章http://lichen1985.com/blog/?p=268里面说下面两种情况,会导致对象引用计数+1,后面需要release。
1. 创建一个对象。包括使用任何名称中包含“alloc”、“new”、或者“copy”的方法。
2. 保留(retain)一个对象。在调用release后,对象就被释放了。然后我在工程的delegate里看到:
MyViewController *aViewController = [[MyViewController alloc] initWithNibName:@”HelloWorld” bundle:[NSBundle mainBundle]];
self.myViewController = aViewController;
[aViewController release];self.myViewController = aViewController;这句话并不会导致引用计数+1,如果要+1,需要调用retain。那对于后面的release,是不是aViewController就里面被释放了呢?那self.myViewController岂不是就无效了么?请各位大侠指点,谢谢!
1. 创建一个对象。包括使用任何名称中包含“alloc”、“new”、或者“copy”的方法。
2. 保留(retain)一个对象。在调用release后,对象就被释放了。然后我在工程的delegate里看到:
MyViewController *aViewController = [[MyViewController alloc] initWithNibName:@”HelloWorld” bundle:[NSBundle mainBundle]];
self.myViewController = aViewController;
[aViewController release];self.myViewController = aViewController;这句话并不会导致引用计数+1,如果要+1,需要调用retain。那对于后面的release,是不是aViewController就里面被释放了呢?那self.myViewController岂不是就无效了么?请各位大侠指点,谢谢!
解决方案 »
- xcode 4.3.2 初次使用的一些问题
- ipone开发菜鸟问题
- 请教各位牛人一下 我的电脑配置如下 可以装苹果系统吗
- 我从rtmp中解码出了音频流,怎么用audioqueue播放呢
- ios中怎样编写当textField输入框获得输入焦点时触发一个事件(函数)
- xib文件里的view不显示,却显示黑屏
- 关于开启VPN之后程序无法打开的问题
- XCode6 MainStoryboard 中 storyboardWithName:bundle:
- 大家都用什麼樣的設備開發IOS?
- XML解析 XML直接转NSDictionary NSXmlKit
- 苹果可以用C语言开发么?
- 请问下,如果想要一边拍摄一边将视频传到服务器播放??
retain,setter方法对参数进行release旧值再retain新值。这里所有权已经改变了
我觉得主要还是因为myViewController的属性中有retain,如果没有myViewController=aViewController这句话,在[aViewController release];后,就已经被释放了,谁也用不了它了。
但是因为retain,在给myViewController赋值之后,引用计数应该是2了,后面的release又使引用计数变为1,这样这个对象就不会被释放了。最后在dealloc里面调用[myViewController release];来释放对象。
nslog(@"%i",[aViewController retaincount]); 来查看,他的retainCount是不是有2这个东东其实他们都是一次,在没有 release之前都是1。没有2只是一个简单的地址赋值你用指针来理解就OK啦。
- (void) setMyField: (NSString*) newValue {
if (newValue !=myField) {
[myField release];
myField = [newValue retain];
}
}
这样的操作,所以会自动retain的,[aViewController release];后其实他的引用计数还会是1,而不是0,再一个一个对象释放不是release是释放,而是引用计数为0后,会自动调用dealloc方法,其实release只是引用计数减一
如果还是不太清楚,可以看看
http://blog.csdn.net/volcan1987/article/details/6721828
http://blog.csdn.net/volcan1987/article/details/6664975
空说没有意义。
不要关心太多的细节,不像C++那样,你得考虑你申请的内存到什么时候释放,该不该再申请的问题。MyViewController *aViewController = [[MyViewController alloc] initWithNibName:@”HelloWorld” bundle:[NSBundle mainBundle]];
self.myViewController = aViewController;
[aViewController release];首先生成了一个视图控制器,接着把它传给了本类对象,接着任务完成,你释放就行了。
至于刚刚生成的视图控制器,本类对象会正确的处理即可。