ARC从强到强

时间:2013-05-18 21:55:36

标签: automatic-ref-counting strong-references

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

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

在主控制器中

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

另一个控制器

    @property(nonatomic, strong)NSArray *repotLabels;

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

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

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

1 个答案:

答案 0 :(得分:2)

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

strong - 设置属性时,对象保留。之前的值是已发布。这就是你想要与对象大多数一起使用的东西,因为你通常想要在你的ivars上保留它们以便它们不会被释放在下面,这看起来像这样:

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

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

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

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

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

- 这与assign非常相似,除非释放已分配的对象,否则指针将恢复为nil。这通常用于否则会导致保留周期的情况。例如,视图控制器将自身设置为其拥有的视图的委托。弱用于避免两个物体相互保留,从而永远不会被释放。

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

怀疑您要使用保留,因为您已列出。据我所知,除非_leftPanelViewController.repotLabels是弱属性,否则在您列出的代码段中不会出现弱属性。