为了方便 我们 先假设 每个某一类型的物件 都包含 一个变量n,那么 读取这个变量的措施 叫做 n,而 设定这个变量的措施 叫做 setN:。当你 实施 n 和 setN:这两项措施时,你 应该想一想 你存在n这个变量中的 是 什么,读取出来的 是 什么,你 是否需要保护 这些数据。
假如 我们 需要设定 一个AddressCard类型物件中的姓名,也就是 name,我们 可以这样:
其中的newName 代表 新卡片中的姓名。假如 setName:这项措施的具体内容 是 这样:
那么 物件newName的地址 首先 存入 变量theName,接着 存入 变量 name。setName:这项措施 实施完后,本地变量theName 会消失,那么 物件newName的地址 就存储在了 newName这个变量 和 newCard这个物件中的name这个变量当中。如果 改变 物件newName的内容 就会改变 物件newCard中name这个变量所代表的姓名。
于是 更加安全的办法 就是 在setName:这项措施当中 为newName这个物件 创建 一个复制品,再 将 这个复制品的地址 存储 在这项措施实施对象中的name变量里。我们 先为复制品 分配 内存空间,然后 再采取 initWithString:这项措施 将 物件newName的内容 写入 新分配的内存空间。我们 也可以采取 copy这项措施 办到 这点:
我们 也可以将 原先地址存储在变量name中的物件 添加 到自动释放池中:
那么 @synthesize命令 就会生成 这样的setName:措施:
@property命令中的nonatomic 告诉 系统 不要用 互斥锁(互相排斥的意思) 来保护 n 和 setN:这两项措施,也就是 这里的name 和 setName:这两项措施。编写多线程代码的人 会用 互斥锁 来防止 两条线程 在同一时间 执行 同一代码。互斥锁 会使 程序 变慢,如果 你编写的 是 单线程程序,那么 你 应该避免 使用 互斥锁。