代码之家  ›  专栏  ›  技术社区  ›  user1118321

使用std::vector<>作为Objective-C属性

  •  1
  • user1118321  · 技术社区  · 7 年前

    我有一个ObjultC++类,我希望拥有一个C++的属性。 std::vector<std::string> . 我是这样声明的:

    @interface WordModel : NSObject
    
    @property std::vector<std::string>  words;
    
    @end
    

    当我试图在 vector 什么都没发生。例如,在 -init 方法,我这样做:

        std::string nextLine;
        while(wordsFile.good())
        {
            std::getline(wordsFile, nextLine);
            if (nextLine.length() > 0)
            {
                self.words.push_back(nextLine);
            }
        }
    

    打电话之后 push_back() 调试器报告 self.words 矢量 仍然是空的。为什么?编译期间或运行时都没有错误消息。

    如果我把房子改成ivar,一切都会按预期进行。也就是说,如果我把它变成这样:

    @interface WordSetModel : NSObject
    {
        std::vector<std::string>    words;
    }
    @end
    

    我不明白为什么会有这么大的差别。

    1 回复  |  直到 7 年前
        1
  •  4
  •   newacct    7 年前

    Objective-C属性只是一对getter和setter方法,您可以使用点表示法访问它们。对于一个财产 @property std::vector<std::string> words; ,getter和setter方法将是:

    - (std::vector<std::string>)words;
    - (void)setWords:(std::vector<std::string>)w;
    

    (我假设您没有实现getter和setter,所以它会自动合成它们。但即使您自己实现了它们,我相信它仍然必须具有上述类型签名。)

    当你读到 self.words ,这只是调用getter的语法糖: [self words] std::vector 按价值 . 我想这是你的问题。当按值传递或返回某物时,它将被复制。所以你得到一个向量的临时副本,推到它,然后丢弃它。基础实例变量中的向量不变。对于一种方法,它可以给你一些可以改变底层向量的方法,它必须返回给你一个C++“引用”。 std::vector<std::string> & . 我不确定你能不能用Objective-C属性(我还没试过)。