使用 std::vector<> 作为 Objective-C 属性
Using a std::vector<> as an Objective-C property
我有一个 Objective-C++ class,我希望有一个 属性,它是一个 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;
(我假设你没有实现 getters 和 setters,所以它自动合成了它们。但即使你自己实现了它们,我相信它仍然会必须具有上述类型签名。)
当您从 self.words
读取时,这只是调用 getter 的语法糖:[self words]
。请注意,getter return 是 std::vector
值 。我认为这是你的问题。当您按值传递或 return 某些内容时,它会被复制。所以你得到了一个向量的临时副本,推送到它,然后丢弃它。底层实例变量中的向量没有改变。对于能够为您提供一些可以让您更改底层向量的方法,它必须 return 给您一个 C++ "reference",类似于 std::vector<std::string> &
。我不确定你是否可以用 Objective-C 属性 来做到这一点(我没试过)。
我有一个 Objective-C++ class,我希望有一个 属性,它是一个 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;
(我假设你没有实现 getters 和 setters,所以它自动合成了它们。但即使你自己实现了它们,我相信它仍然会必须具有上述类型签名。)
当您从 self.words
读取时,这只是调用 getter 的语法糖:[self words]
。请注意,getter return 是 std::vector
值 。我认为这是你的问题。当您按值传递或 return 某些内容时,它会被复制。所以你得到了一个向量的临时副本,推送到它,然后丢弃它。底层实例变量中的向量没有改变。对于能够为您提供一些可以让您更改底层向量的方法,它必须 return 给您一个 C++ "reference",类似于 std::vector<std::string> &
。我不确定你是否可以用 Objective-C 属性 来做到这一点(我没试过)。