【问题标题】:ARC from strong - to - strongARC从强到强
【发布时间】:2013-05-18 21:55:35
【问题描述】:

我想知道 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];

【问题讨论】:

    标签: automatic-ref-counting strong-references


    【解决方案1】:

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

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

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

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

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

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

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

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

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

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

    【讨论】:

    • 谢谢你,对你最后的陈述是的,它确实是弱属性,我意识到并将其标记为强,但复制没有意义
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-09-18
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 2012-02-16
    • 2012-01-04
    • 2012-10-01
    相关资源
    最近更新 更多