0

我想知道ARC下的正确方法。

我在控制器中有强大的 NSArray(我自己的自定义类对象)@property,当我初始化另一个控制器时,我必须将这些数组中的一个 NSString 传递给另一个弱控制器的指针。但我不喜欢这个,因为我需要对它进行排序

在主控制器中

    _leftPanelViewController.repotLabels = [[self.availableDashBoards sortedArrayUsingDescriptors:@[sortByReportLabel]]];

另一个控制器有

    @property(nonatomic, strong)NSArray *repotLabels;

1)据我所知,第一个返回弱指针,我分配给另一个弱指针,所以如果 mainController 中的代码超出范围,我的 reportLabel 变为“nil”?

2)所以如果我让reportLabels属性(强)这可以解决问题但是还有其他方法吗?最后我还应该做这样的“复制”吗?

    _leftPanelViewController.repotLabels = [[self.availableDashBoards sortedArrayUsingDescriptors:@[sortByReportLabel]]copy];
4

1 回答 1

2

我认为属性的内存管理选项何时启动可能会有些混乱。它们只影响setter而不是getter。以下是使用 ARC 的快速回顾:

strong -设置属性时保留对象。先前的值被释放。这是您大多数时候想要与对象一起使用的,因为您通常希望在您的 ivars 上保留,这样它们就不会被释放在下面,这看起来像这样:

-(void)setObject:(id)obj
{
    [obj retain];
    [_object release];
    _object = obj;
}

assign - 始终用于非对象值,例如 C 标量或结构。由于这些只是值而不是对象,因此不会进行内存管理。在下面,这看起来像这样:

-(void)setInteger:(NSInteger)newInt
{
    _nteger = newInt;
}

复制-创建一个相同类型的对象,并复制传入的对象的内容。这仅适用于符合 NSCopying 协议的对象。当您想使用对象的原始值然后编辑原始对象时,通常会使用它。(例如,如果您将 NSMutableString 设置为“Jane”并使用它设置了一个复制的属性,即使您将原始 NSMutableStringn 更改为“John”,该属性仍会报告“Jane”)在下面,这看起来像这样:

-(void)setObject:(id)obj
{
    id copy = [obj copy];
    [_object release];
    _object = copy;
}

- 这与分配非常相似,除了当分配的对象被释放时,指针恢复为 nil。这通常用于会导致保留循环的情况。例如,一个视图控制器将自己设置为它所拥有的视图的委托。Weak 用于避免两个对象相互保留,因此永远不会被释放。

当你写的时候object.property = value;,[object setProperty:value]; 实际上是在幕后调用。

怀疑您想使用您列出的保留。据我所知,您列出的代码片段中没有弱属性发挥作用,除非_leftPanelViewController.repotLabels是弱属性。

于 2013-05-21T02:36:22.667 回答