黑马程序员技术交流社区

标题: 关于内存管理的疑惑 [打印本页]

作者: whymerain    时间: 2015-3-18 12:16
标题: 关于内存管理的疑惑
_Book = [Book retain]中,[Book retain]为Book计数器加一,返回Book对象。这样直接让  _Book指向BOOk看不大懂,以前指向都是这样写的 Person *p = [Person new]。

作者: a380vs747`    时间: 2015-3-18 13:05
首先,你的变量名写的不规范,变量名第一个字母是小写,类名第一个字母大写。
作者: youga    时间: 2015-3-18 13:11
慢 慢 看就懂了。。。。
作者: a380vs747`    时间: 2015-3-18 13:18
其次,关于这个_book = [book retain];原来不关心内存的时候,写的setter方法就是
- (void)setBook:(Book *)book
{
      _book = book;
}
这个你应该还记得吧,那加上retain返回book是一样的啊。
所谓的_book指向book是不好理解的。这个你可以理解为赋值操作就行了。就是把对象book的内容都赋值给_book。
如果硬要理解_book指向book,那你理解为,对象名其实都是指针。当初新建book对象的时候,book就指向一个放着该对象的内存,计数器为1,那_book = book;就是让_book也指向这个放着该对象的内存.这样该对象就有两个指针指向它,所以计数器要加1为2.

这些其实你可以不用纠结,以后setter方法都是@property代替。oc有ARC机制,基本不需要考虑内存管理。
作者: whymerain    时间: 2015-3-18 13:38
a380vs747` 发表于 2015-3-18 13:18
其次,关于这个_book = ;原来不关心内存的时候,写的setter方法就是
- (void)setBook:(Book *)book
{

虽然看不大懂,但是很有道理的样子
作者: marswawa    时间: 2015-3-18 13:39
楼主,你之所以看不懂说明你还是没有深层的理解,事实上对象就是用一个指针变量来保存的,而任何对象由于其都继承自基类所以都天然的具备retain方法,而我敢大胆的猜想到他再设计这个retain方法的时候就设计好了他的返回值为当前对象所属类型的指针。
retain就是给retain count加1,然后返回当前对象,谁调用返回谁,你所的那个person是新创建出来的对象,而[book retain]时book对象已经存在了,只不过book对象在执行完retain方法后顺便将自己返回了而已,希望能帮到你。
作者: whymerain    时间: 2015-3-18 13:39
whymerain 发表于 2015-3-18 13:38
虽然看不大懂,但是很有道理的样子

[book retain] 的返回值是Book 的话就通了
作者: TRY!    时间: 2015-3-18 13:42
a380vs747` 发表于 2015-3-18 13:18
其次,关于这个_book = ;原来不关心内存的时候,写的setter方法就是
- (void)setBook:(Book *)book
{

   敢问楼主您看到哪里了?怎么懂怎么多?
作者: a380vs747`    时间: 2015-3-18 13:47
TRY! 发表于 2015-3-18 13:42
敢问楼主您看到哪里了?怎么懂怎么多?

我不是楼主,我是帮楼主解答问题的。我是零基础,其实懂得很少,自己看了俩月c语言和oc的基础,各看了一本书,然后看了教学视频。我觉得其实不看书也行,直接看视频也可以,慢慢看。
我的入学申请的进度慢了,我是都看完了才来入学申请的,其实可以先申请,边等进度边看。
我现在很担心自己赶不上第七期,或者考不过...
作者: TRY!    时间: 2015-3-18 13:54
a380vs747` 发表于 2015-3-18 13:47
我不是楼主,我是帮楼主解答问题的。我是零基础,其实懂得很少,自己看了俩月c语言和oc的基础,各看了一 ...

   我刚看,你已经很牛了,佩服!




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2