V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Maxbee
V2EX  ›  iOS

请教一个 iOS 编程的问题

  •  
  •   Maxbee · 2015-11-23 23:24:34 +08:00 · 2766 次点击
    这是一个创建于 3289 天前的主题,其中的信息可能已经有所发展或是发生改变。

    @property (nonatomic, strong) NSArray *heros;

    • (NSArray *)heros
      {
      if (_heros == nil) {
      // 初始化
      // 1.获得 plist 的全路径
      NSString *path = [[NSBundle mainBundle] pathForResource:@"heros.plist" ofType:nil];

      // 2.加载数组
      NSArray *dictArray = [NSArray arrayWithContentsOfFile:path];
      
      // 3.将 dictArray 里面的所有字典转成模型对象,放到新的数组中
      NSMutableArray *heroArray = [NSMutableArray array];
      for (NSDictionary *dict in dictArray) {
          // 3.1.创建模型对象
          MJHero *hero = [MJHero heroWithDict:dict];
          NSLog(@"%@",hero);
          // 3.2.添加模型对象到数组中
          [heroArray addObject:hero];
      }
      
      // 4.赋值
      _heros = heroArray;
      

      }
      return _heros;
      }

    代码如上,为什么没有调用 heros 却能获得 renturn 的对象? iOS 新手衷心求指教,想了好久都没想到是为什么,怀疑我自己是不是知识点缺失了。。。

    17 条回复    2015-11-25 16:07:54 +08:00
    czwen1993
        1
    czwen1993  
       2015-11-24 00:29:55 +08:00
    你没有调用 heros 又怎么知道能获得 retrun 的对象?
    pupboss
        2
    pupboss  
       2015-11-24 00:43:43 +08:00 via iPhone
    一看注释就猜是明杰的代码,往下一看还真是他的
    pupboss
        3
    pupboss  
       2015-11-24 00:44:52 +08:00 via iPhone
    很明显懒加载嘛
    loveuqian
        4
    loveuqian  
       2015-11-24 00:52:03 +08:00
    你在自己代码搜索一下 self.heros 有没有出现在哪个等号的左边
    有的话,就是在那个地方调用了你重写的这个 get 方法

    另外那个 if 判断,现在都写成
    if (!_heros)
    因为一不小心你的 = 号少写一个。。就废了
    就算你要写 == 也要写在左边,就好像
    if (0 == number)
    LINAICAI
        5
    LINAICAI  
       2015-11-24 01:15:16 +08:00
    草 你这个数组成员默认的 getter 就是 heros ,你换个方法名就好了。
    Maxbee
        6
    Maxbee  
    OP
       2015-11-24 07:51:48 +08:00
    @pupboss 被你发现了,你也看过?哈哈
    HancockXu
        7
    HancockXu  
       2015-11-24 07:53:11 +08:00
    楼上正解, heros 变量的 getter 方法也叫 heros ,你只要访问这个变量就会去调 getter 方法。
    Maxbee
        8
    Maxbee  
    OP
       2015-11-24 07:56:32 +08:00
    先感谢你,有,但是是在重写的 heros 里,这样也能调用?
    Maxbee
        9
    Maxbee  
    OP
       2015-11-24 08:05:38 +08:00
    @HancockXu 谢谢,么么哒
    Maxbee
        10
    Maxbee  
    OP
       2015-11-24 08:07:01 +08:00
    @loveuqian 谢谢你,问题解决了,想了一晚上,可能是最近学太多,学蒙了,把一些基础的忘了,谢谢!
    Maxbee
        11
    Maxbee  
    OP
       2015-11-24 08:07:41 +08:00
    @LINAICAI 解决了,感谢!
    Maxbee
        12
    Maxbee  
    OP
       2015-11-24 08:08:02 +08:00
    @czwen1993 解决了,谢谢么么哒
    Maxbee
        13
    Maxbee  
    OP
       2015-11-24 08:13:05 +08:00
    @loveuqian 再问一个问题,这个问题还是有点模糊。在 ViewContorller 里面方法里用_age = xx 这种方法设置的属性,属于哪个对象的?
    Keita1314
        14
    Keita1314  
       2015-11-24 09:19:11 +08:00
    @Maxbee _age 是实例变量,当前对象的,@property age 只是属性,只不过 @synthesize age = _age 了,所以可以直接用属性来代表获得和设置实例变量,建议看看实例变量与属性相关知识
    loveuqian
        15
    loveuqian  
       2015-11-24 09:21:37 +08:00
    @Maxbee
    你可能要回去看看 @property 做了什么
    他帮你生成了一个 _ 开头的成员变量,生成了 setter 和 getter 方法
    Maxbee
        16
    Maxbee  
    OP
       2015-11-24 12:46:02 +08:00
    @Keita1314 👌,感谢!
    zhangliang5
        17
    zhangliang5  
       2015-11-25 16:07:54 +08:00
    @Maxbee gggg
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3420 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 11:50 · PVG 19:50 · LAX 03:50 · JFK 06:50
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.