macOS下NSToolbar自定义配置报错及代码崩溃问题求助
问题一:NSToolbar相关方法警告的原因
你写的[self allowsUserCustomization:YES];和[self autosaveConfiguration:YES];是错误的调用方式,这两个其实是Objective-C属性,而非带参数的实例方法:
allowsUserCustomization是NSToolbar的BOOL属性,正确设置方式是用setter方法[self setAllowsUserCustomization:YES];,或者点语法self.allowsUserCustomization = YES;autosaveConfiguration同理,正确写法是[self setAutosaveConfiguration:YES];或self.autosaveConfiguration = YES;
编译器找不到你定义的-allowsUserCustomization:和-autosaveConfiguration:方法,因此抛出警告。
问题二:std::vector转NSArray导致崩溃的原因
崩溃的核心问题是[NSArray arrayWithObjects:&m_default[0] count:m_default.size()]的使用前提不满足:
这个方法要求传入的是连续存储的Objective-C对象指针数组,但你的代码存在以下可能的问题:
- std::vector存储的不是Objective-C对象:如果
m_default或m_allowed里存的是C语言类型(比如const char*、枚举值等)而非NSString*(或NSObject子类指针),直接把这些指针当成ObjC对象传入,会导致Runtime处理非法内存,触发崩溃。 - 内存布局不兼容:即使vector里存的是ObjC对象指针,这种直接取地址的方式虽然语法上可行,但如果vector的元素类型和
id的内存布局不匹配,也可能引发问题。
正确的实现方式
不要直接通过内存地址转换,而是遍历vector逐个添加元素到NSMutableArray:
- (NSArray *)toolbarDefaultItemIdentifiers:(NSToolbar*)toolbar { NSMutableArray *defaultIDs = [NSMutableArray arrayWithCapacity:m_default.size()]; for (size_t i = 0; i < m_default.size(); ++i) { // 如果m_default存的是const char*,需要先转成NSString: // NSString *itemID = [NSString stringWithUTF8String:m_default[i]]; [defaultIDs addObject:m_default[i]]; } return defaultIDs; } - (NSArray *)toolbarAllowedItemIdentifiers:(NSToolbar*)toolbar { NSMutableArray *allowedIDs = [NSMutableArray arrayWithCapacity:m_allowed.size()]; for (size_t i = 0; i < m_allowed.size(); ++i) { [allowedIDs addObject:m_allowed[i]]; } return allowedIDs; }
另外注意你代码里的多余分号;;,虽然编译时会忽略,但建议清理掉避免混淆。
内容的提问来源于stack exchange,提问作者Igor
相关产品推荐
相关产品推荐

