我需要在NSArray中存储对对象的弱引用,以防止保留循环.我不确定使用的语法是否正确.这是正确的方法吗?

Foo* foo1 = [[Foo alloc] init];
Foo* foo2 = [[Foo alloc] init];

__unsafe_unretained Foo* weakFoo1 = foo1;
__unsafe_unretained Foo* weakFoo2 = foo2;

NSArray* someArray = [NSArray arrayWithObjects:weakFoo1, weakFoo2, nil];

Note that I need to support iOS 4.x,因此是__unsafe_unretained而不是__weak.


EDIT (2015-02-18):

对于那些想要使用真正的__weak分(不是__unsafe_unretained分)的人,请判断这个问题:Collections of zeroing weak references under ARC

推荐答案

正如Jason所说,你不能做NSArray个store 弱引用.实现Emile关于将一个对象包装到另一个存储弱引用的对象中的建议的最简单方法如下:

NSValue *value = [NSValue valueWithNonretainedObject:myObj];
[array addObject:value];

另一个选项是:一个category,使NSMutableArray可选地存储弱引用.

请注意,这些是"不安全的未恢复"引用,而不是自零弱引用.如果在解除分配对象后数组仍然存在,那么就会有一堆垃圾指针.

Objective-c相关问答推荐

反编译ARM64和理解分支目标边界

日期更改时的 UIDatePicker

iOS中的非延迟图像加载

如何用零填充左侧的整数?

如何获取 AppIcon 的 UIImage?

dispatch_semaphore_dispose 上的 EXC_BAD_INSTRUCTION(代码=EXC_I386_INVOP,子代码=0x0)

如何在 XCode 中复制文件?

如何将 .plist 文件中的数据 struct 读入 NSArray

如何四舍五入浮点值?

代码问题:格式字符串不是字符串文字

如何从设置屏幕打开位置服务屏幕?

强制iOS应用程序崩溃的最快方法是什么?

Objective-C 中的 NSString indexOf

Objective-C 中的同步和异步调用与多线程有什么区别?

通过将另一个字符串重复给定次数来创建 NSString

可以在 NSLocalizedString 中使用变量和/或参数吗?

如何在 UITextField 上自动打开键盘?

AppDelegate 的当前视图控制器?

使用正则表达式查找/替换 NSString 中的子字符串

判断 UIViewController 是否即将从导航堆栈中弹出?