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

标签 properties objective-c++

我有一个 Objective-C++ 类,我希望有一个属性是 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 vector仍然是空的。为什么?在编译期间或运行时都没有错误消息。

如果我将属性更改为 ivar,一切都会按预期工作。也就是说,如果我把它变成这样:

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

我很困惑为什么会有这样的差异。

最佳答案

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] .请注意,getter 返回一个 std::vector 按值(value)。我认为这是你的问题。当您按值传递或返回某些内容时,它会被复制。因此,您将获得向量的临时副本,将其推送到它,然后将其丢弃。基础实例变量中的向量保持不变。对于能够为您提供可以更改基础向量的方法的方法,它必须返回给您一个 C++“引用”,例如 std::vector<std::string> & .我不确定您是否可以使用 Objective-C 属性来做到这一点(我没有尝试过)。

关于properties - 使用 std::vector<> 作为 Objective-C 属性,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51979119/

相关文章:

c++ - 在 Objective-C++ 中重载 [] 运算符

objective-c - 从 Objective-C++ 调用 swift 函数

objective-c - XCode 4 是否支持区域以及您的代码管理方法是什么?

objective-c - 使用属性与方法的指南

.net - 当 TextBox 为空时,数据绑定(bind)不会更新

c# - 如何使用自定义属性属性对类的属性进行排序

java - 如何在运行时更改 Java 属性?

c++ - 从 C++ 类调用变量到 Objective C 类

ios - 在 IOS 中创建图像文件夹

C# 动态设计时属性