ios xcode build llvm

ios - Xcode 8 con "Lanzamiento: Más rápido, más pequeño[-Os]" tiene un problema extraño y no funciona bien en algunos casos



build llvm (2)

Su problema está en esta línea:

__weak NSString *aStrTitle = [NSString stringWithFormat:@"%@",aDimensionModel.dimension_description];

+[NSString stringWithFormat:] crea una nueva cadena con una cuenta de retención igual a cero. Y esto generalmente está bien, ya que este valor se asigna a una variable strong o se pasa como un parámetro a la llamada de método. En ambos casos, la cuenta de retención se incrementa y el valor permanece intacto. ¡Pero estás asignando esta nueva cadena a la variable __weak ! Las variables débiles no afectan la retención de recuento, por lo que permanece en cero después de ejecutar esta línea. Y así, la cadena creada se elimina inmediatamente después de la creación.

La solución es simple: elimine el especificador __weak y estará listo.

No tiene sentido declarar las variables locales como débiles (a menos que sean capturadas por los bloques). También "limpiezas" como esta: aStrVCName = nil; no tienen ningún efecto en absoluto.

  • Todas las variables locales se liberan automáticamente cuando el método termina su ejecución.
  • aStrVCName todos modos, aStrVCName es débil, por lo que nunca afecta a los recuentos de los objetos a los que apunta.

Tengo 1 destino en mi proyecto y tengo 3 configuraciones de compilación

Debug Production y Release

Mientras ejecuto mi aplicación con la configuración de production o debug y está funcionando bien, no hay problemas, pero cuando cambio la build configuration mi build configuration para que me dé algunos problemas extraños, como algunos valores de cadena no se almacenan en el archivo plist y cuando depuro mi modo de lanzamiento, no obtuve ningún valor en mi depurador.

Después de demasiada investigación sobre mi código y configuración de compilación y alguna forma de sugerencia, SO lo que hice a continuación cambio en mi configuración de Compilación como se menciona a continuación.

Cambie el nivel de optimización bajo el encabezado de la generación de código Apple LLVM 8.0

Obtención del problema en el nivel de optimización inferior:

Se resolvió el problema con el cambio a continuación en el nivel de optimización:

No sé por qué está funcionando en Ninguno [-O0] .

¿Puede alguien ayudarme en el parche anterior?

Aquí hay una parte sensible donde se ve afectado el nivel de optimización.

Mi código de marcador guardado donde tengo valor, pero aún así está almacenando NULL en plist.

- (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:@" - %@ - %@ - %@",aDivisionModel.division_name,[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; }

Usando el código anterior, todos los valores se almacenan con éxito en plist, pero aStrTitle tiene valor y aún se almacena como null .


Tuve un problema similar al migrar a xcode 8 y swift 3. Resulta que a swift no le gusta el hecho de que anulo las funciones de las clases base en las extensiones. Ver Anular métodos en extensiones Swift.

Por alguna razón, el compilador no se queja, y para empeorar las cosas, los "problemas extraños" solo comenzaron a ocurrir en el nivel de optimización Fastest, Smallest [-Os] .

Parece que en el nivel de optimización Fastest, Smallest [-Os] , el compilador llamará a la función desde la clase base y no a la función desde la extensión. En el nivel de optimización None [-O0] , el compilador llamará a la función desde la extensión.

por ejemplo:

public class BaseController : UIViewController { override func reloadInterface() { println("ok") } } public class NewController : BaseController { override func viewDidLoad() { super.viewDidLoad() reloadInterface() } } extension NewController { override func reloadInterface() { println("extended function") } }

imprimirá "función extendida" en el nivel de optimización ninguno, e imprimirá "ok" en el nivel de optimización más rápido ...

para acortar la historia, no invalide las funciones en extensiones rápidas