ios – Xcode 8与“发布:最快,最小[-Os]”有一些奇怪的问题,在
我的项目中有1个目标,并有3个构建配置
调试生产&发布 当我使用调试或生产配置运行我的应用程序,它的工作正常没有任何问题,但是当我更改我的构建配置以释放它给我一些奇怪的问题,如一些字符串值不存储在plist文件中,当我调试我的发布模式,我在调试器中没有任何价值. 对我的代码和构建设置进行了太多的调查,并提出了一些建议形式,所以我已经做了如下改变了我的Build设置. 在Apple LLVM 8.0代码生成标头下更改优化级别 获取以下问题优化级别: 下列问题解决了优化级别的变化: 不知道为什么它在无[-O0]中工作. 任何人都可以帮助我上面的补丁? 以上是影响优化级别的敏感部分. 我保存的书签代码,我有价值,但仍然存储在plist的NULL. - (IBAction)bookmark:(id)sender{ DimensionModel *aDimensionModel = APPDELEGATE.selected_dimensionModel; EmirateModel *aEmirateModel = APPDELEGATE.selected_emirateModel; DivisionModel *aDivisionModel = APPDELEGATE.selected_divisionModel; __weak NSString *aStrVCName = self.bookMarkViewModel.selectedStrVCName; //Add Title string in Dictionary and then in Plist __weak NSString *aStrTitle = [NSString stringWithFormat:@"%@",aDimensionModel.dimension_description]; aStrTitle = [aStrTitle stringByReplacingOccurrencesOfString:@"(null)" withString:@""]; if (IS_ENGLISH) { aStrTitle = [aStrTitle stringByAppendingString:[NSString stringWithFormat:@" - %@ - %@ - %@",aDivisionModel.division_name,aEmirateModel.emirate_name,[self.bookMarkViewModel.strDataType isEqualToString:@"Number"]?@"(0)":@"(%)"]]; }else{ aStrTitle = [aStrTitle stringByAppendingString:[NSString stringWithFormat:@" - %@ - %@ - %@",[Utilities getEmirateNameinArabicByCode:aEmirateModel.emirate_code],[self.bookMarkViewModel.strDataType isEqualToString:@"Number"]?@"(0)":@"(%)"]]; } if (APPDELEGATE.selectedDimRecordTimeModel.record_year == -1) { aStrTitle = [aStrTitle stringByAppendingString:[NSString stringWithFormat:@" - %@",[LanguageUtility getLocalizedStringForKey:@"All Years"]]]; }else{ aStrTitle = [aStrTitle stringByAppendingString:[NSString stringWithFormat:@" - %ld",(long)APPDELEGATE.selectedDimRecordTimeModel.record_year]]; } NSMutableDictionary *aMutDicGraphDetail = [NSMutableDictionary new]; [aMutDicGraphDetail setObject:[NSString stringWithFormat:@"%@",self.bookMarkViewModel.strSelectedDim] forKey:@"DimCode"]; [aMutDicGraphDetail setObject:[NSString stringWithFormat:@"%@",aStrVCName] forKey:@"VCName"]; [aMutDicGraphDetail setObject:[NSString stringWithFormat:@"%@",PLIST_TITLE_BOOKMARK] forKey:@"PlistBookmark"]; [aMutDicGraphDetail setObject:[NSString stringWithFormat:@"%@",IS_ENGLISH?@"ENGLISH":@"ARABIC"] forKey:@"Language"]; if (self.bookMarkViewModel.strSelectedDim == nil) { [aMutDicGraphDetail setObject:[NSString stringWithFormat:@"%@",[LanguageUtility getLocalizedStringForKey:aStrVCName]] forKey:@"Title"]; }else{ [aMutDicGraphDetail setObject:[NSString stringWithFormat:@"%@",aStrTitle] forKey:@"Title"]; } [aMutDicGraphDetail setObject:[NSString stringWithFormat:@"%@",APPDELEGATE.selectedDimRecordTimeModel.record_time] forKey:@"RecordTime"]; [aMutDicGraphDetail setObject:[NSString stringWithFormat:@"%ld",(long)APPDELEGATE.selectedDimRecordTimeModel.record_year] forKey:@"RecordYear"]; [aMutDicGraphDetail setObject:[NSString stringWithFormat:@"%@",aEmirateModel.emirate_code] forKey:@"EmirateCode"]; [aMutDicGraphDetail setObject:[NSString stringWithFormat:@"%@",self.bookMarkViewModel.strDataType] forKey:@"DataType"]; [aMutDicGraphDetail setObject:[NSString stringWithFormat:@"%@",aDivisionModel.division_code] forKey:@"DivisionCode"]; [aMutDicGraphDetail setObject:[NSString stringWithFormat:@"%d",APPDELEGATE.isDataTypeSwitchHide] forKey:@"switchHide"]; [aMutDicGraphDetail setObject:[NSString stringWithFormat:@"%@",APPDELEGATE.strYearOrMonthFromRbtnCtrl] forKey:@"YearOrMonthFromRbtnCtrl"]; [aMutDicGraphDetail setObject:@(self.bookMarkViewModel.selectedIndexPath).stringValue forKey:DimSelectedIndex]; /* Check for RegionVC and CountryVC*/ if ([aStrVCName isEqualToString:@"RegionMainVC"] || [aStrVCName isEqualToString:@"CountryMainVC"]){ [aMutDicGraphDetail setObject:[NSString stringWithFormat:@"%@",self.bookMarkViewModel.strComparison] forKey:@"Comparison"]; [aMutDicGraphDetail setObject:[NSString stringWithFormat:@"%ld",self.bookMarkViewModel.intSelectedRegionId] forKey:@"RegionId"]; } [self.bookMarkViewModel saveBookmark:aMutDicGraphDetail]; aStrVCName = nil; } 使用上面的代码,所有的值都被成功地存储到plist中,但是aStrTitle在它里面是有价值的,它仍然存储为null. 解决方法
你的问题在这一行:
__weak NSString *aStrTitle = [NSString stringWithFormat:@"%@",aDimensionModel.dimension_description]; ?[NSString stringWithFormat:]创建一个保留计数等于零的新字符串.这通常是可以的,因为这个值被赋值给一个强变量,或者作为参数传递给方法调用.在这两种情况下,保留计数增加,值保持不变.但是您将这个新的字符串分配给__weak变量!弱变量不影响保留计数,因此在执行该行后仍保持零.所以创建的字符串在创建后立即被删除. 解决方法很简单:删除__weak说明符,你会很好去. 声明局部变量没有任何意义(除非它们被块捕获).也像这样“清理”:aStrVCName = nil;根本没有影响. >方法完成执行时,所有局部变量都会自动释放.> aStrVCName是弱的,所以它永远不会影响它指向的对象的保留计数. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |