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








本文转自 wws5201985 51CTO博客,原文链接:http://blog.51cto.com/wws5201985/790691,如需转载请自行联系原作者
目录
相关文章
|
6月前
|
jenkins Unix 持续交付
个人记录jenkins编译ios过程 xcode是9.4.1
个人记录jenkins编译ios过程 xcode是9.4.1
88 2
|
3月前
|
iOS开发 MacOS Perl
解决Xcode运行IOS报错:redefinition of module ‘Firebase‘和could not build module ‘CoreFoundation‘
解决Xcode运行IOS报错:redefinition of module ‘Firebase‘和could not build module ‘CoreFoundation‘
126 4
|
3月前
|
iOS开发 开发者
解决xcode doesn‘t support iphone’s ios 14.6 (18f72)
解决xcode doesn‘t support iphone’s ios 14.6 (18f72)
244 3
|
2月前
|
设计模式 前端开发 Swift
探索iOS开发:Swift与Objective-C的较量
在这篇文章中,我们将深入探讨iOS开发的两大编程语言——Swift与Objective-C。我们将分析这两种语言的特性、优势和局限性,并讨论它们在现代iOS开发中的应用。无论你是初学者还是有经验的开发者,这篇文章都将为你提供有价值的见解和建议。
55 3
|
3月前
|
测试技术 虚拟化 iOS开发
iOS自动化测试方案(二):Xcode开发者工具构建WDA应用到iphone
这篇文章是iOS自动化测试方案的第二部分,详细介绍了在Xcode开发者工具中构建WebDriverAgent(WDA)应用到iPhone的全过程,包括环境准备、解决构建过程中可能遇到的错误,以及最终成功安装WDA到设备的方法。
170 0
iOS自动化测试方案(二):Xcode开发者工具构建WDA应用到iphone
|
3月前
|
测试技术 开发工具 虚拟化
iOS自动化测试方案(一):MacOS虚拟机保姆级安装Xcode教程
这篇文章提供了一份保姆级的教程,指导如何在MacOS虚拟机上安装Xcode,包括环境准备、基础软件安装以及USB扩展插件的使用,以实现iOS自动化测试方案的第一步。
94 0
iOS自动化测试方案(一):MacOS虚拟机保姆级安装Xcode教程
|
3月前
|
缓存 iOS开发
如何在Xcode删除某个版本的IOS模拟器
如何在Xcode删除某个版本的IOS模拟器
535 1
|
3月前
|
iOS开发
mac不通过Xcode直接打开IOS模拟器
mac不通过Xcode直接打开IOS模拟器
210 2
|
3月前
|
开发工具 iOS开发 容器
【Azure Blob】关闭Blob 匿名访问,iOS Objective-C SDK连接Storage Account报错
【Azure Blob】关闭Blob 匿名访问,iOS Objective-C SDK连接Storage Account报错
|
3月前
|
图形学 数据安全/隐私保护 iOS开发
Unity与IOS⭐Xcode打包,上架TestFlight的完整教程
Unity与IOS⭐Xcode打包,上架TestFlight的完整教程