为何使用属性?

And*_*rew 2 iphone properties objective-c ipad ios

所以我已经在Objective-C上编程了一年多了,我似乎无法理解属性的使用.我已经在互联网上搜索了几次,但从未真正找到过很好的解释.我理解如何创建它们:

@property (something, something) something *variableName;
@syntheize variableName;
Run Code Online (Sandbox Code Playgroud)

但是我应该创建所有实例变量属性.对我而言,据我所知,这似乎是浪费代码.但是当我在线查看代码时,有时我会在一个类中看到25个属性.我认为这是浪费.我唯一一次使用它们的方法是将信息从UITableView选定的单元格传递给细节viewController.为此,我使用:

@property (copy) NSString *myString;
Run Code Online (Sandbox Code Playgroud)

你也可以解释一下:nonatomic,copy,retain,assign,等意思.

谢谢

Pen*_*One 7

这些属性是创建getter和setter的便捷方法.


Atmoic v Nonatomic

假设您是@synthesizing方法实现,原子与非原子会更改生成的代码.如果您正在编写自己的setter/getter,则atomic/nonatomic/retain/assign/copy仅仅是建议性的.

使用原子,合成的setter/getter将确保始终从getter返回整个值或由setter设置,而不管任何其他线程上的setter活动.也就是说,如果线程A位于getter的中间,而线程B调用setter,则实际可行的值 - 一个自动释放的对象,很可能 - 将返回给A中的调用者.

在非原子,没有这样的保证.因此,非原子比原子快得多.

原子不做的是对线程安全做出任何保证.如果线程A与线程B同时调用getter并且C调用具有不同值的setter,则线程A可以获得返回的三个值中的任何一个 - 在调用任何setter之前的值或者传递给setter的任一值在B和C中.同样,对象最终可能会得到B或C的值,无法分辨.

确保数据完整性 - 多线程编程的主要挑战之一 - 是通过其他方式实现的.


分配,保留,复制

简而言之,assign vs retain vs copy确定了合成访问器如何与Objective-C内存管理方案交互:

  • assign是默认值,只是执行变量赋值
  • retain指定应该在发送时发送新值-retain并发送旧值
  • copy指定应在发送时发送新值-copy并发送旧值.

请记住,保留是在创建的对象上完成的(它会增加引用计数),而copy会创建一个新对象.不过,区别在于您是要为对象添加另一个保留还是创建一个全新的对象.