The documentation says:
Retaining an object creates a strong reference, and an object cannot be deallocated until all of its strong references are released. If two objects retain each other, neither object ever gets deallocated because the connection between them cannot be broken
As an example, let's consider a UITableViewController that implements UITableViewDelegate protocol. UITableView is retained by it's view controller, although the UITableView does not retain it's delegate.
As said on the document above, UITableViewController will only complete its deallocation when all its strong references get released. Since the UITableView that has the UItableViewController as a delegate doesn't retain it, when the owner of UItableViewController calls release on it, the retain count will go to zero and the dealloc method will get called.
Now imagine that UITableView retains its delegate. UITableViewController will have a retain count of at least +2. One with it's owner and another with UITableView. When UITableViewController's owner calls release on it, the retain count will go to +1, and not to zero as it was expected, and so the dealloc method won't get called until the retain count reaches zero. To reach zero, UITableViewController would need to release its UITableView that would then release its delegate (UITableViewController). Because the UITableViewController will only disposes its view (UITableView) when deallocing this moment would never happen because the retain count won't go bellow +1.
(let's not take in consideration memory warnings and any other possible case...I just saw that ViewController/View is not the best option for this example, but I've written too much already. :))
Does that make sense?
|
相关推荐
iOS 中,在声明@property 属性时,总是要在括号中写上assign、retain、copy、weak、strong 中的一个,这些修饰符有什么区别?下面我们来详细介绍。 assign: assign 一般用来修饰基本的数据类型,包括基础数据类型...
- 对于需要保持对象生命周期的属性,如`UIViewController`的`delegate`,应使用`retain`。 - 对于不可变对象(如`NSString`),通常使用`copy`以防止对象被外部修改。 - 对于性能敏感的场景,可选择使用`...
6. @property的内存管理关键字:在Objective-C中,@property声明属性时可以指定内存管理的关键字,比如assign、retain和copy。retain表示通过retain增加对象的引用计数,assign表示简单的赋值,不增加引用计数,copy...
10. **属性(Property)的assign与retain**:`assign`属性通常用于非对象类型,只进行赋值操作,不改变对象的引用计数。内置类如`UITableViewDataSource`的`delegate`属性通常设为`assign`,因为如果设为`retain`,...
`retain`、`assign`和`copy`分别表示不同的内存管理策略,其中`retain`会增加对象的引用计数,`assign`仅做赋值,不涉及内存管理,`copy`用于深拷贝对象。 11. **控制类的作用**:在iPhone开发中,控制器类如...
为什么TableViewController的delegate常用assign而不是retain? - **原因**:为了避免循环引用问题,通常使用`assign`。 - **循环引用**:当两个对象互相持有对方的强引用时,会导致内存泄漏。 #### 11. 何时使用...
属性可以包含不同的特性,比如readwrite(读写)、readonly(只读)、nonatomic(非原子的)、atomic(原子的)、strong(强引用)、weak(弱引用)、assign(直接赋值)、copy(复制)等。 在iOS开发中,正确使用@...
属性的类型通常使用`assign`,除非对象需要保留对代理的强引用,这时使用`strong`。如果代理遵循协议并需要在协议方法中修改自身,可能会使用`weak`来防止循环引用。`copy`通常用于需要保持原始数据不变的情况,不...
@property(nonatomic, assign) id<JLGPSLocationDelegate> delegate; - (id)initWithDelegate:(id)delegate; @end ``` 如果类声明中包含多个协议,每个协议之间应使用逗号隔开,并在逗号后空一个空格。 #### 三、...
assign、retain与copy的区别 - **assign**:简单的赋值操作,不增加引用计数。 - **retain**:增加对象的引用计数。 - **copy**:创建一个新的对象副本。 - **区别总结**: - **retain**和**copy**都会增加引用...
13. **delegate属性**:通常为`assign`以防止循环引用,因为代理对象通常拥有被代理对象,若互相保留,可能导致内存泄漏。 14. **内存泄漏检查**:题目16分析了内存泄漏的可能性并提出了修改建议。 15. **基本数据...
@property (nonatomic, assign) id<MyDelegate> delegate; @end ``` 解析: - `MyDelegate`协议定义了一个名为`didJobs:`的方法,该方法接收一个`NSArray`类型的参数。 - `MyClass`类声明了一个类型为`MyDelegate`...
#### 题目96:autorealease、retain、copy、assign分别代表什么? - **知识点**: - ** autorealease**:表示对象被放入自动释放池中。 - ** retain**:增加对象的引用计数。 - ** copy**:创建一个对象的深拷贝...
- Objective-C引入了属性的概念,使得数据成员的访问更加方便,支持自动内存管理( retain, assign, weak, strong)。 - 使用`@property`声明属性,`@synthesize`生成getter和setter方法。 5. **继承...
### 第88题:`autorelease`、`retain`、`copy`、`assign`的区别是什么? - **`autorelease`**:此属性指示系统在对象不再被需要时自动释放它。它主要用于临时使用的对象,例如方法内部创建的对象。使用`autorelease...