public static CFBundle[]? GetAll() { // as per apple documentation: // CFBundleGetAllBundles // // 'This function is potentially expensive and not thread-safe' // // This means, that we should not trust the size of the array, since is a get and // might be modified by a diff thread. We are going to clone the array and make sure // that Apple does not modify the array while we work with it. That avoids changes // in the index or in the bundles returned. using (var cfBundles = new CFArray(CFBundleGetAllBundles(), false)) using (var cfBundlesCopy = cfBundles.Clone()) { return(CFArray.ArrayFromHandleFunc <CFBundle> (cfBundlesCopy.Handle, (handle) => new CFBundle(handle, false), false)); } }
public static CFBundle[] GetAll() { // as per apple documentation: // CFBundleGetAllBundles // // 'This function is potentially expensive and not thread-safe' // // This means, that we should not trust the size of the array, since is a get and // might be modified by a diff thread. We are going to clone the array and make sure // that Apple does not modify the array while we work with it. That avoids changes // in the index or in the bundles returned. using (var cfBundles = new CFArray(CFBundleGetAllBundles())) using (var cfBundlesCopy = cfBundles.Clone()) { var bundleCount = cfBundlesCopy.Count; // the property is a C call, calling everytime we loop is not needed var managedBundles = new CFBundle [bundleCount]; for (int index = 0; index < bundleCount; index++) { // follow the get rule, we do not own the object managedBundles [index] = new CFBundle(cfBundlesCopy.GetValue(index), false); } return(managedBundles); } }