gpt4 book ai didi

objective-c - __unsafe_unretained 在结构中

转载 作者:行者123 更新时间:2023-12-01 11:38:32 25 4
gpt4 key购买 nike

假设我有一个结构,我在其中声明如下:

struct myStruct
{
NSString *aString;
}

上面给出了错误。

但是,我可以通过以下方式修复错误:

struct myStruct
{
__unsafe_unretained NSString *aString;
}

它消除了错误,但会在运行时崩溃,因为我想 aString 会立即被释放。

我试过 __strong 但它无法编译。

有没有其他方法可以在结构中存储对象并正确使用它?

最佳答案

您可以创建一个新对象并将其用作指向结构的指针(因为这就是 Objective C 对象)。因此,如果您使用所需的实例变量创建 NSObject 的子类,则可以将其完全视为指向结构的指针(一旦您初始化了它)。即

myObj = [[myObjClass alloc] init];

myObj->instanceVariable1 = @"myString";

正如下面评论中提到的,您需要像这样在接口(interface)中声明变量:

@interface myObjStruct : NSObject
{
@public
NSString *instanceVariable1;
}

对于 NSString,您可以使用 CFStringRef 代替,或者将 NSString * 转换为 CFString 并使用 CFRetain() 保留它,或者使用 CFBridgingRetain 立即获得递增的保留计数。您可以使用从 CF 类型(例如 CFArray CFDictionary)免费桥接的任何类型来执行此操作。

struct testStruct {
CFStringRef str;
};

- (void)aMethod
{
NSString *string = @"Hello struct";
struct testStruct test = {
CFBridgingRetain(string),
};
}

您现在拥有该字符串的所有权,并且需要在某个时候对 test.str 调用 CFRelease 以避免内存泄漏。要返回 NSString,您可以像这样转换它 NSString *string = (__bridge NSString *)test.str;

上面的代码增加了字符串对象的保留计数。有可能让它适用于任何像这样的对象:

struct testStruct {
__unsafe_unretained AnyObj *obj;
};

- (void)aMethod
AnyObj *aObj = [[AnyObj alloc] init];
CFBridgingRetain(aObj); \\increment the retain count.

struct testStruct test = {
aObj,
};

aObj = nil;

NSLog(@"%@", aObj);
}

要稍后释放此对象,您需要执行 CFRelease((__bridge CFTypeRef)(test.obj));。请注意,如果您删除 CFBridgingRetain(aObj);,此代码可能会崩溃。

您也可以尝试使用 id objc_retain(id value); 虽然要使用它,您需要手动包含 arc.h header ,请参阅 How to import objc_retainAutoreleasedReturnValue?您将使用它来增加保留值,就像上面的代码一样,但不需要强制转换。您还必须使用等效的发布功能。

关于objective-c - __unsafe_unretained 在结构中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24704111/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com