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> atomic,setter和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