Ich bin neu in Objective-C, nachdem ich 20 Jahre lang C ++ geschrieben habe.
Meiner Ansicht nach eignet sich Objective-C hervorragend für lose gekoppelte Nachrichten, ist jedoch für die Datenverwaltung schrecklich.
Stellen Sie sich vor, wie glücklich ich war zu entdecken, dass xcode 4.3 Objective-C ++ unterstützt!
Jetzt benenne ich alle meine .m-Dateien in .mm um (kompiliert als Objective-C ++) und verwende C ++ - Standardcontainer für die Datenverwaltung.
Somit wird das Problem "Array schwacher Zeiger" zu einem std :: -Vektor von __schwachen Objektzeigern:
#include <vector>
@interface Thing : NSObject
@end
std::vector<__weak Thing*> myThings;
Thing* t = [Thing new];
myThings.push_back(t);
for(auto weak : myThings) {
Thing* strong = weak;
if (strong) {
}
}
Welches ist äquivalent zum c ++ Idiom:
std::vector< std::weak_ptr<CppThing> > myCppThings;
std::shared_ptr<CppThing> p = std::make_shared<CppThing>();
myCppThings.push_back(p);
for(auto weak : myCppThings) {
auto strong = weak.lock();
if (strong) {
}
}
Proof of Concept (im Lichte von Tommys Bedenken hinsichtlich der Neuzuweisung von Vektoren):
main.mm:
#include <vector>
#import <Foundation/Foundation.h>
@interface Thing : NSObject
@end
@implementation Thing
@end
extern void foo(Thing*);
int main()
{
std::vector<__weak Thing*> myThings;
Thing* t = [[Thing alloc]init];
for (int i = 0 ; i < 100000 ; ++i) {
myThings.push_back(t);
}
foo(myThings[5000]);
t = nullptr;
foo(myThings[5000]);
}
void foo(Thing*p)
{
NSLog(@"%@", [p className]);
}
Beispiel für eine Protokollausgabe:
2016-09-21 18:11:13.150 foo2[42745:5048189] Thing
2016-09-21 18:11:13.152 foo2[42745:5048189] (null)