Je suis novice en Objective-C, après 20 ans d'écriture en C++.
À mon avis, objective-C est excellent pour la messagerie à couplage lâche, mais horrible pour la gestion des données.
Imaginez ma joie de découvrir que xcode 4.3 supporte objective-c++ !
Maintenant, je renomme tous mes fichiers .m en .mm (compilés comme objective-c++) et j'utilise les conteneurs standard c++ pour la gestion des données.
Ainsi, le problème du "tableau de pointeurs faibles" devient un std::vector de pointeurs d'objets __faibles :
#include <vector>
@interface Thing : NSObject
@end
// declare my vector
std::vector<__weak Thing*> myThings;
// store a weak reference in it
Thing* t = [Thing new];
myThings.push_back(t);
// ... some time later ...
for(auto weak : myThings) {
Thing* strong = weak; // safely lock the weak pointer
if (strong) {
// use the locked pointer
}
}
Ce qui est équivalent à l'idiome c++ :
std::vector< std::weak_ptr<CppThing> > myCppThings;
std::shared_ptr<CppThing> p = std::make_shared<CppThing>();
myCppThings.push_back(p);
// ... some time later ...
for(auto weak : myCppThings) {
auto strong = weak.lock(); // safety is enforced in c++, you can't dereference a weak_ptr
if (strong) {
// use the locked pointer
}
}
Preuve de concept (à la lumière des préoccupations de Tommy sur la réallocation des vecteurs) :
main.mm :
#include <vector>
#import <Foundation/Foundation.h>
@interface Thing : NSObject
@end
@implementation Thing
@end
extern void foo(Thing*);
int main()
{
// declare my vector
std::vector<__weak Thing*> myThings;
// store a weak reference in it while causing reallocations
Thing* t = [[Thing alloc]init];
for (int i = 0 ; i < 100000 ; ++i) {
myThings.push_back(t);
}
// ... some time later ...
foo(myThings[5000]);
t = nullptr;
foo(myThings[5000]);
}
void foo(Thing*p)
{
NSLog(@"%@", [p className]);
}
exemple de sortie de journal :
2016-09-21 18:11:13.150 foo2[42745:5048189] Thing
2016-09-21 18:11:13.152 foo2[42745:5048189] (null)
13 votes
"Je plains le faible foo !"
4 votes
Je suggère de ne pas lutter contre le cadre et d'utiliser NSPointerArray avec l'option NSPointerFunctionsWeakMemory NSPointerFunctionOption.
1 votes
@leviathan : Cette question a été posée avant la sortie d'iOS 6.
0 votes
J'ai créé este est un dictionnaire qui stocke les objets sous la forme de références faibles avec mise à zéro. Il peut être modifié (et nettoyé) pour répondre à vos besoins.