zoukankan      html  css  js  c++  java
  • 实验证明:ObjectiveC++ 完美支持 ARC

      从 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

  • 相关阅读:
    [Swift]UIAlertController 以及 Swift 中的闭包和枚举
    递归算法
    [Javascript] Querying an Immutable.js Map()
    [Javascript] Modifying an Immutable.js Map()
    [Javascript] Creating an Immutable Object Graph with Immutable.js Map()
    [Javascript] Manage Application State with Immutable.js
    [Javascript] Using JSHint for Linting with Gulp
    [Angular + Unit] AngularJS Unit testing using Karma
    [AngularJS] Sane, scalable Angular apps are tricky, but not impossible.
    [Javascript] Array
  • 原文地址:https://www.cnblogs.com/ldcsaa/p/2347635.html
Copyright © 2011-2022 走看看