Property
Use weak property to avoid strong reference cycle
- Typical senario: delegate
+---------------------------------------------------------------------+
| NSTableView:                       Delegate Object:                 |
|                          strong                                     |
|                        --------->                                   |
| @property id delegate;            @property NSTableView *tableview; |
|                        <---------                                   |
|                          strong                                     |
+---------------------------------------------------------------------+
- Solution: declare 'delegate' as weak property
+----------------------------------------------------------------------------+
| NSTableView:                              Delegate Object:                 |
|                                  weak                                      |
|                               --------->                                   |
| @property (weak) id delegate;            @property NSTableView *tableview; |
|                               <---------                                   |
|                                 strong                                     |
+----------------------------------------------------------------------------+
Use object cache to keep weak object alive