我想知道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];
答案 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
是弱属性,否则在您列出的代码段中不会出现弱属性。