在弧当你不合成时会发生什么(In arc what happens when you don'

2019-08-02 12:31发布

在iOS的ARC启用的项目,当我是不允许不合成一个属性,因为保留/释放,会发生什么?

@interface SomeClass : NSObject {
    NSMutableArray*     _pieces;
}
@end

什么是在这种情况下,伊娃_pieces的内存语义? 说我把它用, _pieces = whatever

被_pieces设为零,当我SomeClass的实例被释放? 被_pieces存储为一个弱引用? 如果保留了_pieces所有其他对象释放,这将是空的,当我试图访问它?

Answer 1:

一对夫妇的意见,其中大部分可能是由基于他人的反馈清楚这一点的:

  1. 你综合性能,而不是实例变量,并在你的榜样,你向我们展示了一个实例变量,而不是一个属性的一个例子。

  2. 你的问题可能意味着一些假设合成和能力做之间的连接retain / release ,但目前还没有这样的连接。 能力做retainrelease是无论您使用的是功能ARC与否。 它无关,与合成属性。

  3. 正如其他人所观察到的,明确宣布实例变量,比如你的榜样,是strong引用,默认情况下。 所以,在你的榜样, _pieces是一个strong参考。

  4. 是的,当你的SomeClass对象被释放,它会删除其strong参考_pieces对象。 很显然,如果这是最后强烈的参考对象的指向_pieces它会被释放和任何其他weak ,你必须在其他地方将被设置为引用nil 。 有关内存管理一个更加完整的讨论,请参阅苹果公司的高级内存管理编程指南 ,并过渡到ARC 。

  5. 你问“如果保留了所有其他对象_pieces释放,这将是nil ,当我试图访问它?” 显然,这将是真实的,如果_pieces是一个weak引用,但考虑到这是一个隐含strong参考SomeClass ,不,不是这样的。

  6. 如果你想使pieces一个声明的属性 ,语法是

    @property (nonatomic, strong) NSMutableArray* pieces;

    的指定strongweak (或其他)决定了物业的内存管理。

  7. 如果声明的属性,你不但不再有明确定义的实例变量,而是它现在建议你真的不应该这样做(当它的合成,因为编译器会为你创建伊娃)。 但是,如果你碰巧有正确的名称的显式声明的实例变量为你的财产,编译器将使用该属性。 但是,这不仅没有必要,而且不可取的(因为如果你输错实例变量的名字,你可能在不知不觉中有两个实例变量结束)。 只是让编译器合成的实例变量,你的属性,这潜在的不确定性消失。

  8. 将一个属性合成的实例变量的名字是由语法支配财产执行指令 ,即在@synthesize声明。 因此,如果你有一个@synthesize的发言pieces形式的财产:

    @synthesize pieces;

    那么实例变量将被称为pieces 。 但是,如果你使用的首选@synthesize的语法:

    @synthesize pieces = _pieces;

    然后该实例变量名将具有前述下划线(其是,按照惯例,优选的,以避免在性能和实例变量之间的代码模糊)。 而且,随着的Xcode 4.4,如果你省略@synthesize声明为@property ,它会隐与后者的语法合成它适合你,也就是实例变量将承担前导下划线)。



Answer 2:

假设你没有创建一个使用该属性,它会覆盖假定行为 ,ARC项目实例变量假设强,因此,声明确实是

@interface SomeClass : NSObject {
    __strong NSMutableArray* _pieces;
}
@end

所以,在回答你的问题

被_pieces设为零,当我SomeClass的实例被释放?

没有,但指定实例,以它不会导致它被释放。

被_pieces存储为一个弱引用?

不,这是一个有力的参考。

如果保留了_pieces所有其他对象释放,这将是空的,当我试图访问它?

不,这是作为你的第一个相同的问题。



Answer 3:

你声明属性命名pieces或者这是一个直伊娃?

如果您定义的属性,则内存使用情况取决于你如何定义属性。

如果这是一个直伊娃则默认情况下伊娃将是strong 。 这基本上意味着伊娃将适当保留和释放什么都反对你分配给它。 您可以放心地使用它,而不必担心它。



Answer 4:

据我所知,ARC将会把它当作你会以类似的方式对待它strong 。 当你分配给它,传入的值会retain ED,不再指着将价值release d。 如果它在某种程度上成为了释放它只会吊着。 如果你有一个财产申报,ARC将被指定有遵守规则,以及存取将在表单自动为您合成@synthesize someObject = _someObject 。 当对象被释放,我相信该对象被发送release ,因此如果没有别的主张所有权,指向的对象由指针也将被释放。



Answer 5:

随着新的运行时你只需要@properties顺便说一句 - 不声明实例变量,不合成



文章来源: In arc what happens when you don't synthesize