我看到,在为iOS编写代码时,到处都建议使用属性来访问实例变量,因为这有助于内存管理等.

这个建议对我不太合适.我发现使用属性而不是普通的旧IVAR需要太多的代码,如果你对内存管理感到满意,我就看不到它的好处.真的那么重要吗?你管理实例变量的方法是什么?

推荐答案

并不一定要为所有IVAR声明属性.我想到了几点:

  • 如果一个ivar在对象的生命周期内只被分配一次,那么通过声明一个属性,你不会真正获得任何东西.只需在init年期间保留/复制/分配,然后在dealloc年期间根据需要发布.
  • 如果ivar要频繁更改,那么声明属性并始终使用访问器将更容易避免内存管理错误.
  • 可以在中的类扩展中声明属性.m文件而不是文件.h文件,如果属性和IVAR是私有的.
  • 当以iOS 4.0+为目标时,如果定义属性并合成访问器,则根本不需要在头中声明IVAR.

所以我通常使用属性,但对于像NSMutableArray这样的东西,一个对象在init期间分配,并用来保存一堆whatever,我将使用一个普通的旧ivar,因为我永远不会重新分配ivar.

Objective-c相关问答推荐

如何判断 WkWebView 是否在 Objective-C 中完成加载?

无法从其 DataSource 获取单元格

未找到 RKObjectMapping.h

指针缺少可空性类型说明符

NSInternalInconsistencyException: '无效参数不满足: !stayUp || CLClientIsBackgroundable(内部->fClient)'

UIAlertController:supportedInterfaceOrientations 被递归调用

使用 DatePicker 展开和折叠 UITableViewCells

command/usr/bin/codedesign 失败,退出代码 1-代码符号错误

无法在导航栏中心设置titleView,因为返回按钮

如何为 iPhone 6/7 自定义边到边图像指定尺寸?

CLLocationManager startUpdatingLocation 未调用 locationManager:didUpdateLocations: 或 locationManager:didFailWithError:

UIWebView 委托方法 shouldStartLoadWithRequest:在 WKWebView 中等效?

try 标记应用程序图标但未获得用户标记应用程序的权限:iOS 8 Xcode 6

iOS 编译错误:“CDVCommandDelegateImpl”没有可见的@interface 声明选择器“执行:”

当单元格全屏时,为什么 UICollectionView 会记录错误?

xcode 5.1 中的 Arm64 架构

UIRefreshControl - 在 iOS 7 中 pull 刷新

UIApplication.sharedApplication.delegate.window 和 UIApplication.sharedApplication.keyWindow 有什么区别?

UIScreen MainScreen Bounds 返回错误的大小

而不是 push segue 如何替换视图控制器(或从导航堆栈中删除)?