Mar*_*eid 211 iphone memory-management objective-c ios
作为Objective-C的新手,有人可以按照@property指令给我一个概述保留,分配,复制和我缺少的任何其他内容吗?他们在做什么,为什么我要用另一个?
liz*_*iza 294
在了解@property的属性之前,您应该知道@property的用途.
@property提供了一种定义类要封装的信息的方法.如果使用@property声明对象/变量,那么导入其类的其他类可以访问该对象/变量.
如果在头文件中使用@property声明对象,则必须在实现文件中使用@synthesize对其进行合成.这使得对象KVC兼容.默认情况下,编译器将合成此对象的访问器方法.
访问器方法有:setter和getter.
示例:.h
@interface XYZClass : NSObject
@property (nonatomic, retain) NSString *name;
@end
Run Code Online (Sandbox Code Playgroud)
.M
@implementation XYZClass
@synthesize name;
@end
Run Code Online (Sandbox Code Playgroud)
现在编译器将合成name的访问器方法.
XYZClass *obj=[[XYZClass alloc]init];
NSString *name1=[obj name]; // get 'name'
[obj setName:@"liza"]; // first letter of 'name' becomes capital in setter method
Run Code Online (Sandbox Code Playgroud)
@property的属性列表
atomic,nonatomic,retain,copy,readonly,readwrite,assign,strong,getter = method,setter = method,unsafe_unretained
atomic是默认行为.如果一个对象被声明为原子,那么它就变成了线程安全的.线程安全意味着,该类的特定实例中只有一个线程可以控制该对象.
如果线程正在执行getter方法,则其他线程无法对该对象执行setter方法.这很慢.
@property NSString *name; //by default atomic`
@property (atomic)NSString *name; // explicitly declared atomic`
Run Code Online (Sandbox Code Playgroud)
因此,访问非原子属性比原子属性更快.
@property (nonatomic)NSString *name;
Run Code Online (Sandbox Code Playgroud)
setter方法将增加对象的保留计数,以便它将占用自动释放池中的内存.
@property (retain)NSString *name;
Run Code Online (Sandbox Code Playgroud)
即使设置了一个可变字符串并随后进行了更改,该实例也会捕获它在设置时所具有的任何值.不会合成任何setter和getter方法.
@property (copy) NSString *name;
Run Code Online (Sandbox Code Playgroud)
现在,
NSMutableString *nameString = [NSMutableString stringWithString:@"Liza"];
xyzObj.name = nameString;
[nameString appendString:@"Pizza"];
Run Code Online (Sandbox Code Playgroud)
名称将不受影响.
编译器将生成一个getter,但不会生成setter.
@property (readonly) NSString *name;
Run Code Online (Sandbox Code Playgroud)
它与readonly相反.
@property (readwrite) NSString *name;
Run Code Online (Sandbox Code Playgroud)
请记住,启用垃圾收集时,retain和assign基本上是可互换的.
@property (assign) NSInteger year;
Run Code Online (Sandbox Code Playgroud)
它配有ARC.
@property (nonatomic, strong) AVPlayer *player;
Run Code Online (Sandbox Code Playgroud)
在布尔属性(具有YES或NO值的属性)的情况下,getter方法通常以单词"is"开头
@property (getter=isFinished) BOOL finished;
Run Code Online (Sandbox Code Playgroud)
该方法应以冒号结束.
@property(setter = boolBool:) BOOL finished;
Run Code Online (Sandbox Code Playgroud)
不安全引用类似于弱引用,因为它不保持其相关对象存活,但如果目标对象被释放,则不会将其设置为nil.
@property (unsafe_unretained) NSObject *unsafeProperty;
Run Code Online (Sandbox Code Playgroud)
如果需要指定多个属性,只需将它们包含为以逗号分隔的列表,如下所示:
@property (readonly, getter=isFinished) BOOL finished;
Run Code Online (Sandbox Code Playgroud)
Bla*_*rot 271
由MrMage链接的文章已不再有效.所以,这是我在Objective-C的(非常)短时间编码中学到的:
非原子与原子 - "原子"是默认值.始终使用"非原子".我不知道为什么,但我读过的那本书说"很少有理由"使用"原子".(顺便说一句:我读过的书是BNR"iOS编程"一书.)
readwrite与readonly - "readwrite"是默认值.@synthesize时,将为您创建一个getter和一个setter.如果使用"readonly",则不会创建setter.将它用于在对象实例化后不希望更改的值.
保留与复制与分配
swi*_*Boy 147
在阅读了很多文章后,我决定将所有属性信息放在一起:
- 原子//默认
- 非原子
- strong =保留//默认
- weak = unsafe_unretained
- 保留
- 分配//默认
- unsafe_unretained
- 复制
- 只读
- readwrite //默认
以下是详细文章的链接,您可以在其中找到这些属性.
非常感谢所有在这里给出最佳答案的人!
以下是文章中的示例说明
示例:
@property (retain) NSString *name;
@synthesize name;
Run Code Online (Sandbox Code Playgroud)
例:
@property (nonatomic, retain) NSString *name;
@synthesize name;
Run Code Online (Sandbox Code Playgroud)
说明:
假设存在一个名为"name"的原子字符串属性,如果从线程A调用[self setName:@"A"],则从线程B调用[self setName:@"B"],并从中调用[self name]线程C,然后串行执行不同线程上的所有操作,这意味着如果一个线程正在执行setter或getter,那么其他线程将等待.这使得属性"name"读/写安全,但如果另一个线程D同时调用[name release],则此操作可能会导致崩溃,因为此处不涉及setter/getter调用.这意味着对象是读/写安全(ATOMIC)但不是线程安全的,因为另一个线程可以同时向对象发送任何类型的消息.开发人员应确保此类对象的线程安全.
如果属性"name"是非原子的,那么上面例子中的所有线程--A,B,C和D将同时执行,产生任何不可预测的结果.在原子的情况下,A,B或C中的任何一个将首先执行,但D仍然可以并行执行.
例:
@property (strong, nonatomic) ViewController *viewController;
@synthesize viewController;
Run Code Online (Sandbox Code Playgroud)
示例:
@property (weak, nonatomic) IBOutlet UIButton *myButton;
@synthesize myButton;
Run Code Online (Sandbox Code Playgroud)
强烈而微弱的解释,感谢BJ荷马:
想象一下,我们的对象是一只狗,狗想要逃跑(被解除分配).强壮的指针就像是狗的皮带.只要你的皮带附着在狗身上,狗就不会逃跑.如果五个人将他们的皮带连接到一只狗,(五个强指针指向一个物体),那么在所有五个皮带脱落之前,狗不会逃跑.另一方面,弱点就像小孩子指着那只狗说"看!一只狗!" 只要狗仍然在皮带上,小孩子仍然可以看到狗,他们仍然会指向它.然而,一旦所有的皮带脱落,无论有多少小孩指着它,狗都会跑开.一旦最后一个强指针(皮带)不再指向一个对象,该对象将被释放,并且所有弱指针都将被清零.当我们使用弱者?你想要使用弱的唯一一次是,如果你想避免保留周期(例如父母保留孩子而孩子保留父母,所以两者都没有被释放).
例:
@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)
unsafe_unretained
-unsafe_unretained是一个所有权限定符,它告诉ARC如何插入保留/释放调用-unsafe_unretained是assign的ARC版本.
例:
@property (nonatomic, unsafe_unretained) NSString *nickName;
@synthesize nickName;
Run Code Online (Sandbox Code Playgroud)
例:
@property (nonatomic, copy) NSArray *myArray;
@synthesize myArray;
Run Code Online (Sandbox Code Playgroud)
原子属性一次只能由一个线程访问.它是线程安全的.默认是原子的.请注意,没有关键字 原子
Nonatomic意味着多个线程可以访问该项.它是线程不安全的
因此在使用原子时应该非常小心.因为它会影响代码的性能
| 归档时间: |
|
| 查看次数: |
183232 次 |
| 最近记录: |