从 XCode 4.2 开始 Objective-C 支持 ARC,对于广大 iPone 开发者来说是巨大的福音,不用面对满屏 [obj release] 和 [pool drain] 这类丑陋不堪的代码了,更重要的是不用整天为对象释放问题搞得寝食难安。但对于许多从 C++ 转到 ObjC 的开发者来说,其实更喜欢 Obj-C++ 混编。Cocoa 负责界面展现,C++ 负责业务逻辑实现,组合起来十分完美。
问题是 Obj-C++ 能否完美支持 ARC 呢,特别是把 ObjcC 对象放入 STL 容器的情形下能否正常工作?
恭喜大家,答案是肯定的!
测试代码一:
#import <vector> #import <list> using namespace std;
class Y { public: int value;
public: Y(int val = 0) : value(val) { NSLog(@"Y.Y (%d)", value); }
~Y() { NSLog(@"Y.~Y (%d)", value); } };
@interface T : NSObject { @private int value; Y* y; }
- (id) initWithValue:(int)v; @end
@implementation T
- (id) init { return [self initWithValue:0]; }
- (id) initWithValue:(int)v { self = [super init]; self->value = v; self->y = new Y(v);
NSLog(@"T.init (%d)", self->value); return self; }
- (void)dealloc { delete self->y;
NSLog(@"T.dealloc (%d)", self->value); }
@end
class X { public: int value; T* t;
public: X(int val = 0) : value(val) { NSLog(@"X.X (%d)", value); }
~X() { NSLog(@"X.~X (%d)", value); } };
int main(int argc, char *argv[]) { @autoreleasepool { T* t = [[T alloc] initWithValue:1];
{ vector<T*> vt; vt.push_back(t); t = nil; vt.push_back([[T alloc] initWithValue:2]); vt.push_back([[T alloc] initWithValue:3]);
{ //vt.pop_back(); vt.erase(vt.begin()); NSLog(@"< first element had been dealloc >"); }
{ vt.clear(); NSLog(@"< all other elements had been dealloc >"); } } } }
输出结果:
2012-02-11 19:31:56.256 Switcher[3037:f803] Y.Y (1) 2012-02-11 19:31:56.258 Switcher[3037:f803] T.init (1) 2012-02-11 19:31:57.352 Switcher[3037:f803] Y.Y (2) 2012-02-11 19:31:57.353 Switcher[3037:f803] T.init (2) 2012-02-11 19:31:57.578 Switcher[3037:f803] Y.Y (3) 2012-02-11 19:31:57.579 Switcher[3037:f803] T.init (3) 2012-02-11 19:31:57.786 Switcher[3037:f803] Y.~Y (1) 2012-02-11 19:31:57.787 Switcher[3037:f803] T.dealloc (1) 2012-02-11 19:31:58.894 Switcher[3037:f803] < first element had been dealloc > 2012-02-11 19:32:05.227 Switcher[3037:f803] Y.~Y (2) 2012-02-11 19:32:05.228 Switcher[3037:f803] T.dealloc (2) 2012-02-11 19:32:05.229 Switcher[3037:f803] Y.~Y (3) 2012-02-11 19:32:05.230 Switcher[3037:f803] T.dealloc (3) 2012-02-11 19:32:07.787 Switcher[3037:f803] < other elements had been dealloc >
测试代码二:
int main(int argc, char *argv[]) { @autoreleasepool { X* x = new X(1); x->t = [[T alloc] initWithValue:1];
{ list<X*> vx;
vx.push_back(x); vx.push_back(new X(2, [[T alloc] initWithValue:2])); vx.push_back(new X(3, [[T alloc] initWithValue:3]));
{ X* x2 = vx.front(); vx.pop_front(); delete x2;
NSLog(@"< first element had been dealloc >"); }
{ for(list<X*>::iterator it = vx.begin(); it != vx.end(); ++it) delete (*it);
NSLog(@"< all other elements had been dealloc >"); }
vx.clear(); } } }
输出结果:
2012-02-12 02:34:13.403 Switcher[3142:f803] X.X (1) 2012-02-12 02:34:14.516 Switcher[3142:f803] Y.Y (1) 2012-02-12 02:34:14.517 Switcher[3142:f803] T.init (1) 2012-02-12 02:34:26.171 Switcher[3142:f803] Y.Y (2) 2012-02-12 02:34:26.171 Switcher[3142:f803] T.init (2) 2012-02-12 02:34:26.174 Switcher[3142:f803] X.X (2) 2012-02-12 02:34:42.481 Switcher[3142:f803] Y.Y (3) 2012-02-12 02:34:42.481 Switcher[3142:f803] T.init (3) 2012-02-12 02:34:42.484 Switcher[3142:f803] X.X (3) 2012-02-12 02:34:48.856 Switcher[3142:f803] X.~X (1) 2012-02-12 02:34:48.857 Switcher[3142:f803] Y.~Y (1) 2012-02-12 02:34:48.858 Switcher[3142:f803] T.dealloc (1) 2012-02-12 02:35:02.491 Switcher[3142:f803] < first element had been dealloc > 2012-02-12 02:35:07.303 Switcher[3142:f803] X.~X (2) 2012-02-12 02:35:07.303 Switcher[3142:f803] Y.~Y (2) 2012-02-12 02:35:07.304 Switcher[3142:f803] T.dealloc (2) 2012-02-12 02:35:09.319 Switcher[3142:f803] X.~X (3) 2012-02-12 02:35:09.320 Switcher[3142:f803] Y.~Y (3) 2012-02-12 02:35:09.321 Switcher[3142:f803] T.dealloc (3) 2012-02-12 02:35:11.268 Switcher[3142:f803] < all other elements had been dealloc >
CodeProject
|
请发表评论