黑马程序员技术交流社区

标题: 内存管理中的@property有疑问被卡住 大神们 求解答。。 [打印本页]

作者: HM_lpn    时间: 2014-12-18 11:29
标题: 内存管理中的@property有疑问被卡住 大神们 求解答。。
.h文件中的@property中有属性  相应的.m文件中, 为什么同时有set  get方法时,  会报错,必须重新定义实例变量才正确? 只留一个方法时也不重新定义实例变量时,不会报错啊 ?我彻底不记得MJ老师有讲过啊
部分代码实例如下所示:
  1. //Person.h中
  2. // Book是另一个类  表示人拥有书(组合)
  3. #import <Foundation/Foundation.h>
  4. #import "Book.h"  
  5. @interface Person: NSObject
  6.   @property Book *book;
  7. @end

  8. //Person.m中
  9. #import "Person.h"
  10. @implementation Person

  11. - (void)setBook:(Book *)book
  12. {
  13.    if(_book != book)
  14.   {
  15.      [_book release];
  16.      _book = [book retain];
  17.   }
  18. }
  19. @end
复制代码


作者: se7ven    时间: 2014-12-18 12:05
一般情况下,你都不写这两个方法@property会同时帮你生成getter和setter,
你重写set方法时,@property会自动帮你生成get方法;
你重写get方法时,@property会自动帮你生成set方法;
but……
你就是不能用了@property后再同时手写set方法和get方法了,这样的话,编译器通不过,别纠结,,
你问老师,老师也只能跟你说到这:Xcode编译器通不过,,

作者: 从今以后    时间: 2014-12-18 12:34
是不是你同时写了两个方法,编译器就没有为你生成实例变量。只留一个还是会生成的。
作者: HM_lpn    时间: 2014-12-18 20:56
从今以后 发表于 2014-12-18 12:34
是不是你同时写了两个方法,编译器就没有为你生成实例变量。只留一个还是会生成的。 ...

是的。。。。
作者: HM_lpn    时间: 2014-12-18 20:57
se7ven 发表于 2014-12-18 12:05
一般情况下,你都不写这两个方法@property会同时帮你生成getter和setter,
你重写set方法时,@property会自 ...

:o:o看过你解释的好像明白了些什么   谢谢你了:)
作者: 邹志鹏    时间: 2014-12-18 22:13
原因应该是,你重写了set和get方法的话,就会覆盖掉xcode自动生成的,所以相当于没有成员变量_book,不过也没关系,你只需要在.h文件中的@interface里面用{ Book *_book;}声明成员变量应该就可以吧
作者: comeprince    时间: 2014-12-18 23:20
自动生成了,只能重新写一个




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