XYZClass *obj=[[XYZClass alloc]init];
NSString *name1=[obj name]; // get 'name'
[obj setName:@"liza"]; // first letter of 'name' becomes capital in setter method
strong (iOS4 =保留)-it表示"keep this in the heap until I don't point to it anymore" - 换句话说" I'am the owner, you cannot dealloc this before aim fine with that same as retain" - 只有在需要保留对象时才使用strong . - 默认情况下,所有实例变量和局部变量都是强指针 . - 我们通常使用强大的UIViewControllers(UI项目的父母)-strong与ARC一起使用,它基本上可以帮助你,而不必担心对象的保留计数 . 完成后,ARC会自动为您释放它 . 使用关键字strong表示您拥有该对象 .
weak (iOS4 = unsafe_unretained)-it表示"keep this as long as someone else points to it strongly"-与assign相同,不保留或释放-A "weak" reference是您不保留的引用 . - 我们通常对IBOutlets使用弱(UIViewController的Childs) . 这是有效的,因为只要父对象存在,子对象才需要存在 . - 弱引用是不引用的引用通过垃圾收集器保护引用的对象不被集合 . -Weak本质上是分配,一个没有保留的属性 . 除了取消分配对象时,弱指针自动设置为nil
4 回答
由MrMage链接的文章已不再有效 . 所以,这是我在Objective-C的(非常)短时间编码中学到的:
非原子与原子 - “原子”是默认值 . 始终使用“非原子” . 我不知道为什么,但我读过的那本书说“很少有理由”使用“原子” . (顺便说一句:我读过的书是BNR“iOS编程”一书 . )
readwrite与readonly - “readwrite”是默认值 . @synthesize时,将为您创建一个getter和一个setter . 如果使用“readonly”,则不会创建setter . 将它用于在对象实例化后不希望更改的值 .
保留与复制与分配
当属性是指向对象的指针时,需要
当对象可变时,需要
在了解@property的属性之前,您应该知道@property的用途 .
@property 提供了一种定义类要封装的信息的方法 . 如果使用 @property 声明对象/变量,则导入其类的其他类可以访问该对象/变量 .
如果在头文件中使用 @property 声明对象,则必须在实现文件中使用 @synthesize 进行合成 . 这使得对象 KVC compliant . 默认情况下,编译器将为此对象合成 accessor methods .
访问器方法是:setter和getter .
示例:.h
.M
现在编译器将合成 name 的访问器方法 .
atomic, nonatomic, retain, copy, readonly, readwrite, assign, strong, getter=method, setter=method, unsafe_unretained
如果线程正在执行getter方法,则其他线程无法对该对象执行setter方法 . 这很慢 .
因此,访问非原子属性比原子属性更快 .
当属性是指向对象的指针时,需要
setter方法将增加对象的保留计数,以便它将占用自动释放池中的内存 .
即使设置了一个可变字符串并随后进行了更改,该实例也会捕获它在设置时所具有的任何值 . 不会合成任何setter和getter方法 .
现在,
name 将不受影响 .
编译器将生成一个getter,但不会生成setter .
它与readonly相反 .
请记住,当垃圾收集时,保留和分配基本上是可互换的启用 .
它配有ARC .
在布尔属性(具有YES或NO值的属性)的情况下,getter方法通常以单词“is”开头
该方法应以冒号结束 .
不安全引用类似于弱引用,因为它不保持其相关对象存活,但如果目标对象被释放,则不会将其设置为 nil .
如果需要指定多个属性,只需将它们包含为以逗号分隔的列表,如下所示:
在阅读了很多文章后,我决定将所有属性信息放在一起:
以下是详细文章的链接,您可以在其中找到这些属性 .
非常感谢所有在这里给出最佳答案的人!
以下是文章中的示例说明
示例:
例:
说明:
假设存在一个名为“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仍然可以并行执行 .
例:
示例:
Strong & Weak Explanation, Thanks to BJ Homer:
想象一下,我们的对象是一只狗,狗想要逃跑(被解除分配) . 强壮的指针就像是狗的皮带 . 只要你的皮带附着在狗身上,狗就不会逃跑 . 如果五个人将他们的皮带连接到一只狗,(五个强指针指向一个物体),那么在所有五个皮带脱落之前,狗不会逃跑 . 另一方面,弱点就像小孩子指着那只狗说“看!一只狗!”只要狗仍然在皮带上,小孩子仍然可以看到狗,他们仍然会指向它 . 然而,一旦所有的皮带脱落,无论有多少小孩指着它,狗都会跑开 . 一旦最后一个强指针(皮带)不再指向一个对象,该对象将被释放,并且所有弱指针都将被清零 . 当我们使用弱者?你想要使用弱的唯一一次是,如果你想避免保留周期(例如父母保留孩子而孩子保留父母,所以两者都没有被释放) .
例:
例:
-unsafe_unretained是一个所有权限定符,它告诉ARC如何插入保留/释放调用-unsafe_unretained是assign的ARC版本 .
例:
当对象可变时,需要
例:
原子属性一次只能由一个线程访问 . 这是 thread safe . 默认是原子的 . 请注意,没有关键字 atomic
Nonatomic 表示多个线程可以访问该项目 . 它是 thread unsafe
因此在使用原子时应该非常小心 . 因为它会影响代码的性能