在OC中,内存管理采用"引用计数"的机制。这种机制的好处在于:如果有一个对象同时被多个指针指向时,这些指针都对这个对象拥有所有权。如果一个指针放弃所有权时不会将该内存销毁,以避免出现野指针问题。
那么这种机制是如何实现的呢?这里需要几个关键字:
1. retain 是引用计数+1
2. copy 复制一个原对象, 引用计数为 1, 原对象释放
3. assign 直接赋值.
4. dealloc 当引用计数为0 时, 由系统调用, 回收空间
我们都知道,在定义一个类时,我们需要声明属性,系统会根据我们声明的属性自动生成setter和getter方法。但系统默认声明的setter方法是直接赋值的(assign), 这样我们在将对象赋值给成员变量时,就会出现上面所说的问题。为避免这种问题,方便地管理内存,我们需要在声明属性是加上关键字retain。这样,我们再将对象赋值给成员变量时,会使其retaincount+1。
@interface Monitor : NSObject {//显示器类 NSInteger _size;//尺寸 NSString *_type;//屏幕的类型 float _price;//价钱 } @property(nonatomic, retain) NSString *type; @end @implementation Monitor - (void)setType:(NSString *)type { if (_type != type) { [_type release]; _type = [type retain]; } } @end
比如,在type属性声明时加上 retain,它的setter方法如上。
如果声明时加了retain属性,释放时dealloc方法需要重写,代码如下:
- (void)dealloc { [_type release]; [super dealloc]; }
管理内存是需要牢记黄金法则,凡是用alloc, retain, copy关键字时,都要对应使用release或autorelease。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。