penn-wang
一位老和尚,他身边聚拢着一帮虔诚的弟子。这一天,他嘱咐弟子每人去南山打一担柴回来。弟子们匆匆行至离山不远的河边,人人目瞪口呆。只见洪水从山上奔泻而下,无论如何也休想渡河打柴了。无功而返,弟子们都有些垂头丧气。唯独一个小和尚与师傅坦然相对。师傅问其故,小和尚从怀中掏出一个苹果,递给师傅说,过不了河,打不了柴,见河边有棵苹果树,我就顺手把树上唯一的一个苹果摘来了。后来,这位小和尚成了师傅的衣钵传人。

 

NO.1

属性 @property 系统生成的对于成员变量的set和get方法。

@property (nonatomic,retain) UIImage *myImage;  @synthesize myImage = _myImage;

<1> retain 、copy、assign

  IOS为计数器内存管理机制。当且仅当 retainCount==0,内存释放。

  retain作用:使同一块内存的retainCount+1;NSObject * o = [[NSObject alloc] init]; NSObject *v = [o retain];  则o和v的retainCount同为 2,此块内存有两个指针指向。

  copy作用:新建一块内存,与原内存地址不同。这两块内存的retainCount都为1. NSObject * o = [[NSObject alloc] init]; NSObject *v = [o copy]; o和v的retainCount同为1,且o和v的内存地址不同。

  assign作用:类同于c++的别名。理解为一摸一样即可。不会使retainCoun+1.

  release使retainCount-1.

 

<2> atomicsetter和getter为原子操作。所谓的原子操作就是:一个线程调用setter的时候,只有setter完成了,其他的线程的setter才可以执行。等于在函数前后加了锁。

  nonatomic, setter和getter为非原子操作。一般在非多线程的操作下使用。如果一个属性,需要被多线程所操作,并且需要数据的更新,就要声明为atomic。 也正是因为nonatomic不涉及锁,所以它的操作相对快一些

<3>注意细节

  @synthesize myImage = _myImage; 若你没有声明  UIImage *_myImage;那么编译器将会为你自动声明一个_myImage的成员变量。若声明了,则此property是为所声明的myImage成员变量服务。

  同理:UIImage *_tImage; @synthesize myImage = _tImage; 则此property(self.myImage)所setter和getter的目标是:_tImage

  self.XXX : 其实是调用了setter和getter方法。

<4>关于copy 和 mutableCopy

  NSArray *m_1 = [[NSArray alloc] init];    NSArray *m_2 = [m_1 copy];  这样,copy等同于retain的效果,m_1和m_2的内存地址相同。

  NSArray *m_1 = [[NSArray alloc] init];    NSArray *m_2 = [m_1 mutableCopy]; 这样才实现了真正意义上的copy,m_1和m_2的内存地址不同。

   NSMutableArray *m_1 = [[NSMutableArray alloc] init];    NSMutableArray *m_2 = [m_1 copy];  这样,m_1和m_2的内存地址不同。

  不可变对象,copy==retain。

  

新的ios开发qq群,欢迎:145473005

 

posted on 2012-11-29 15:42  penn-wang  阅读(268)  评论(0编辑  收藏  举报