qst*_*tar 54 iphone objective-c nsstring retain ios
一个101问题
假设我正在制作汽车数据库,每个汽车对象定义为:
#import <UIKit/UIKit.h>
@interface Car:NSObject{
NSString *name;
}
@property(nonatomic, retain) NSString *name;
Run Code Online (Sandbox Code Playgroud)
为什么@property(nonatomic, retain) NSString *name;
不@property(nonatomic, assign) NSString *name;
呢?
据我所知,assign
这不会增加引用计数器retain
.但是为什么要使用retain
,因为它是对象的name
成员todo
,它的范围就是它自己.
没有其他外部功能也会修改它.
Chu*_*uck 68
Objective-C中没有"对象的范围"这样的东西.范围规则与对象的生命周期无关 - 保留计数就是一切.
您通常需要声明实例变量的所有权.请参阅Objective-C内存管理规则.对于retain
房产,您的房产所有者声称拥有新价值并放弃旧房产的所有权.对于一个assign
属性,周围的代码必须这样做,这在责任和关注点分离方面同样混乱.您将使用assign
属性的原因是您无法保留该值(例如BOOL或NSRect等非对象类型),或者保留它会导致不必要的副作用.
顺便提一下,在NSString的情况下,通常是正确的属性copy
.这样,如果有人传入NSMutableString(它是有效的 - 它是一种NSString),它就无法从你身下改变.
Axe*_*xel 19
并且不要忘记通过它访问它
self.name = something;
Run Code Online (Sandbox Code Playgroud)
因为
name = something;
Run Code Online (Sandbox Code Playgroud)
不会关心生成的setter/getter方法,而是直接赋值.
fbr*_*eto 12
如果retain
没有保证,NSString*
你的设置name
将比任务声明本身更长.通过使用retain
合成setter 的属性,您可以让它告诉内存管理系统至少还有一个对象有兴趣保留它NSString*
.
小智 9
该self.
在:
self.name = something;
Run Code Online (Sandbox Code Playgroud)
很重要!没有它,您将直接访问变量并绕过setter.
旧的风格(如果我错了,纠正我)会是:
[self setName:something];
Run Code Online (Sandbox Code Playgroud)
无论如何,这个符号是,当我去寻找正确的,我真的很需要(有些眼熟探空)的建议@properties
上NSStrings
.谢谢阿克塞尔.
在阅读了如此多的文章,SO帖子和制作演示应用以检查变量属性属性之后,我决定将所有属性信息放在一起
以下是详细的文章链接,您可以在其中找到上述所有属性,这些属性将极力帮助您.非常感谢所有在这里给出最佳答案的人!
例:
@property (nonatomic, retain) NSString *name;
@synthesize name;
Run Code Online (Sandbox Code Playgroud)
例:
@property (nonatomic, assign) NSString *address;
@synthesize address;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
66051 次 |
最近记录: |