天天看點

iOS:XCode 4.2開始Objective-C支援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;

    Y(int val = 0) : value(val)

    {

        NSLog(@"Y.Y        (%d)", value);

    }

    ~Y()

        NSLog(@"Y.~Y        (%d)", value);

};

@interface T : NSObject {

@private

    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);

class X

    T* t;

    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 >

測試代碼二:

        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;

                for(list<X*>::iterator it = vx.begin(); it != vx.end(); ++it)

                    delete (*it);            

            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 >

本文轉自 wws5201985 51CTO部落格,原文連結:http://blog.51cto.com/wws5201985/790691,如需轉載請自行聯系原作者