Objective c 什么会自动保留和释放?
我有点了解什么是自动保留和释放的,但我找不到任何官方数据,我想我搞错了Objective c 什么会自动保留和释放?,objective-c,reference-counting,Objective C,Reference Counting,我有点了解什么是自动保留和释放的,但我找不到任何官方数据,我想我搞错了 设置用@property(retain)声明的属性将保留和释放旧值,但不在没有self的情况下设置同一对象内的属性。 方法中的所有对象(包括参数)在创建/传递时保留,在方法返回时释放 方法返回的对象不会被释放,而是由其返回的方法释放,因为它的局部变量在方法中 我做错什么了/忘了什么吗? 当退货被丢弃时会发生什么?比如[objectsomemethodthattreturnsanobject]。它对于返回的方法不是本地的,所以
self的情况下设置同一对象内的属性。
当退货被丢弃时会发生什么?比如
[objectsomemethodthattreturnsanobject]代码>。它对于返回的方法不是本地的,所以我不确定它是否会被释放,xCode会发出警告。而不是猜测。这是确定的
设置声明的属性
使用@property(retain)将保留和
释放旧值,但不释放设置
同一对象中的属性
没有自我
有点。没有“设置没有自我的属性”。即直接设置实例变量
方法内的所有对象(包括
参数)在
当
方法返回
没有;见文件
由方法返回的对象
不会被释放,而是会被释放
由返回的方法释放
由于其局部变量位于
方法
一点也不;查看文档。不要猜测。这是确定的
设置声明的属性
使用@property(retain)将保留和
释放旧值,但不释放设置
同一对象中的属性
没有自我
有点。没有“设置没有自我的属性”。即直接设置实例变量
方法内的所有对象(包括
参数)在
当
方法返回
没有;见文件
由方法返回的对象
不会被释放,而是会被释放
由返回的方法释放
由于其局部变量位于
方法
一点也不;见文件
设置用@property(retain)声明的属性将保留并释放旧值,但不会在没有self的情况下在同一对象内设置属性
调用为retain属性合成的setter方法将释放旧值并保留新值。直接设置ivar,而不通过访问者,只会分配ivar。它既不会保留也不会释放任何东西self.foo=bar
正好是[self-setFoo:bar]
。无论setFoo:
做什么,都将完成(一个setFoo:
的合成版本如上所述工作)foo=bar
就是foo=bar
方法中的所有对象(包括参数)在创建/传递时保留,在方法返回时释放
这根本不是事实。它们既不保留也不释放。保留和释放不会神奇地发生。它一方面响应对alloc
、new
、copy
、retain
和release
的调用。使用点表示法只是方法调用的简写,方法调用中可能包含retain
方法返回的对象不会被释放,而是由其返回的方法释放,因为它的局部变量在方法中
事实并非如此。方法返回的对象既不会被保留也不会被释放。按照惯例,名称中带有alloc
、new
或copy
的方法将返回net+1 retain。任何其他方法都将返回净0保留计数(对象上的自动删除数与保留数相同)。“当前”保留计数将始终大于0,否则无法返回对象。(这稍微掩盖了事实真相。如果存在私人保留,则任何情况下的保留计数都可能大于1。但从调用方的角度来看,这是一种有用的思考方式。)
最好看的地方是,它非常简洁地展示了这一切。《内存管理编程指南》的其余部分将给出更多示例
设置用@property(retain)声明的属性将保留并释放旧值,但不会在没有self的情况下在同一对象内设置属性
调用为retain属性合成的setter方法将释放旧值并保留新值。直接设置ivar,而不通过访问者,只会分配ivar。它既不会保留也不会释放任何东西self.foo=bar
正好是[self-setFoo:bar]
。无论setFoo:
做什么,都将完成(一个setFoo:
的合成版本如上所述工作)foo=bar
就是foo=bar
方法中的所有对象(包括参数)在创建/传递时保留,在方法返回时释放
这根本不是事实。它们既不保留也不释放。保留和释放不会神奇地发生。它一方面响应对alloc
、new
、copy
、retain
和release
的调用。使用点表示法只是方法调用的简写,方法调用中可能包含retain
方法返回的对象不会被释放,而是由其返回的方法释放,因为其局部变量位于
- (void)setMyString:(NSString *)newString {
if ( newString != myString ) {
[myString release];
myString = [newString retain];
}
}