使用 std::vector<> 作为 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.wordsvector报告为仍为空。为什么?在编译期间或运行时都没有错误消息。

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

最新更新