IOS的对象都继承于NSObject, 该对象有一个方法:retainCount ,内存引用计数。 引用计数在很多技术都用到: window下的COM组件,多线程的信号量,读写锁,思想都一样。
1. retainCount说明:
alloc 对象分配后引用计数为1
retain 对象的引用计数+1
copy copy 一个对象变成新的对象(新内存地址) 引用计数为1 原来对象计数不变
release 对象引用计数-1 如果为0释放内存
autorelease 对象引用计数-1 如果为0不马上释放,最近一个个pool时释放
Example:
Person *p = [[Person alloc] init]; //retainCount:1 //当对象调用retain方法时,返回的是对象本身,只不过引用计数器加1 [p retain]; //retainCount:2 [p release]; //retainCount:1 //当引用计数器为0时,才调用dealloc方法,并不是一有release方法就调用dealloc方法了 //当引用计数器为0时,此时的指针为野指针,以前指向的那个对象为僵尸对象;对于野指针,可以使用 p = nil,防止 p继续调用 release而报错
2. get 与 set 方法 说明:
假设定义了对象属性:
@property (nonatomic, retain) Book *book;
- (void)setBook:(Book *)book { if(_book != book){ [_book release]; _book = [book retain]; } } - (Book *)book { return _book; }
set方法使用场合,可以通过重写set方法完成很多功能。
Example:
在UITableView使用场合中
-(UICollectionViewCell *)collectionView:(UICollectionView *)collectionView cellForItemAtIndexPath:(NSIndexPath *)indexPath { VStampCell *cell = (VStampCell *)[collectionView dequeueReusableCellWithReuseIdentifier:identifer forIndexPath:indexPath]; VStampDisplayItem *item = self.dataList[indexPath.item]; cell.item = item; return cell; }
可以将模型数据直接赋值给cell中定义的模型,进行重写,从而完成cell中各个属性的赋值工作, item重写的代码如下:
- (void)setItem:(VStampDisplayItem *)item { // 1.加载图片 self.icon.image = [UIImage imageNamed:item.icon]; // 2.设置label文字 self.title.text = item.title; // 3.是否显示选中图标 self.selectedBorder.hidden = !item.isChecking; // 4.选中与没有选中时,字体的颜色切换 self.title.textColor = item.isChecking ? [UIColor colorWithRed:130/255.0 green:130/255.0 blue:130/255.0 alpha:1] : [UIColor whiteColor]; }
Example:
@interface Person: NSObject @property (nonatomic,assign,getter=isRich) BOOL rich; @end
book.rich = NO;取值的时候,比如:
BOOL isRich = book.isRich
3. autorealse说明: