我的代码中的ARC和C ++

时间:2014-10-16 07:27:38

标签: objective-c automatic-ref-counting objective-c++

我有一个场景,我正在尝试创建一个可以在Array上运行的通用C ++类(跨平台)。这个C ++类可以在OS之间移植,以便它可以利用本机Array支持。

例如,它在Mac OS / iOS上运行时使用NSArray,在Windows中运行MFC数组类。我的目标是使这个数组管理类具有通用性。

#ifndef __MixTest__ArrayUser__
#define __MixTest__ArrayUser__

#if defined _MAC_OS
typedef void * ARRAY_HANDLE;
//#elif defined _WINDOWS
#endif

class ArrayUser
{
public:
    ArrayUser() { }
    virtual ~ArrayUser() { }
    void assignArray(ARRAY_HANDLE handle)
    {
        m_array_handle = handle;
    }
    void UseArray();

private:
    ARRAY_HANDLE m_array_handle;
};
#endif /* defined(__MixTest__ArrayUser__) */


//  ArrayUser.cpp
//  MixTest

#include "ArrayUser.h"
#import <Cocoa/Cocoa.h>
void ArrayUser::UseArray()
{
    NSArray *array = (__bridge NSArray *) m_array_handle;

    for (NSString *str in array)
    {
        NSLog(@"Array - %@",str);
    }
}

现在我的目标是在Mac OS上运行它,我在我的准系统Mac OS项目中执行以下操作

#import <Cocoa/Cocoa.h>

@interface AppDelegate : NSObject <NSApplicationDelegate>
@property (assign) IBOutlet NSWindow *window;
@property (strong) NSArray *arrayItems;
@end

实施

#import "AppDelegate.h"
#include "ArrayUser.h"

@interface AppDelegate ()
{
    ArrayUser arrayUser;
}
@end

@implementation AppDelegate

-(id) init
{
    if([super init] !=nil)
    {
        _arrayItems = @[@"Planes",@"Trains",@"Automobiles"];
        arrayUser.assignArray((__bridge ARRAY_HANDLE)_arrayItems);

        arrayUser.UseArray();
    }
    return self;
}

问题

  1. 此转移是否合适?

    arrayUser.assignArray((__ bridge ARRAY_HANDLE)_arrayItems);

  2. 期望_arrayItems很强大,预计将通过AppDelegate进行控制。

    1. 如果_arrayItems没有被定义为强,那么什么是     正确的桥接方式,使对象无法被破坏     (因为ArrayUser需要它)?
    2. 桥接是否应该是相同的,无论是否 _arrayItems强弱? ArrayUser需要它的事实应该向ARC表明该对象不能被释放。什么 在这种情况下是衔接?

0 个答案:

没有答案