ios - Objective-C 101(保留与分配)NSString

标签 ios objective-c iphone nsstring retain

101 题

假设我正在制作汽车数据库 每个汽车对象定义为:

#import <UIKit/UIKit.h>

@interface Car:NSObject{
    NSString *name;
}

@property(nonatomic, retain) NSString *name;

为什么是 @property(nonatomic, retain) NSString *name; 而不是 @property(nonatomic, assign) NSString *name;

我知道 assign 不会像 retain 那样增加引用计数器。但是为什么要使用 retain,因为 nametodo 对象的成员,它的范围是它自己。

其他外部函数也不会修改它。

最佳答案

Objective-C 中没有“对象的范围”这样的东西。范围规则与对象的生命周期无关——保留计数就是一切。

您通常需要声明对实例变量的所有权。见 the Objective-C memory management rules .使用 retain 属性,您的属性 setter 声明新值的所有权并放弃旧值的所有权。使用 assign 属性,周围的代码必须这样做,这在职责和关注点分离方面同样困惑。您使用 assign 属性的原因是您无法保留该值(例如 BOOL 或 NSRect 等非对象类型),或者保留它会导致不必要的副作用。

顺便说一下,对于 NSString,正确的属性类型通常是 copy。这样,如果有人传入 NSMutableString(这是有效的——它 一种 NSString),它就不会从你下面改变。

关于ios - Objective-C 101(保留与分配)NSString,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1380338/

相关文章:

iOS 为什么不能方法 collectionView :didSelectItemAtIndexPath: be called from UITapGestureRecognizer?

ios - Horizo​​ntal ScrollView 不适合它的子 ImageViews?

ios - iPad App 名称和闪屏在模拟器上与 iPad 设备不同

ios - 您好,我需要过滤联系人列表,但 NSPredicate 不起作用

objective-c - UIButton不显示文字设置宽度[UIButton setTitle]

iphone - 使用映射模型在核心数据对象模型之间迁移

iphone - iPhone 中的用户凭证持久性

iphone - 从 tableview 获取数据并将其存储到 sqlite 数据库

objective-c - 处理 UITabBarController.moreNavigationController 中 "More"UINavigationController 的设备旋转

objective-c - 如何将自定义模式对话框设计为常规 View Controller ?