1. 申明为assign 类型的self.releaseCount
.h 文件
@interface RtHomeViewPage :Page {
NSString *_releaseCount;
}
@property(nonatomic,assign)NSString *releaseCount;
.m文件
- (void)dealloc{
[_releaseCount release];
[super dealloc];
}
- (id)init{
NSLog(@"-----before---%ld",[_releaseCountretainCount]);
NSString *tempStr = @"welcome";
self.releaseCount = tempStr;
NSLog(@"----after---- (%ld) -- (%ld) -- (%ld)",[tempStr retainCount], [_releaseCount retainCount] , [self.releaseCount retainCount]);
NSInteger tempInt = 200;
tempStr = [[NSString alloc] initWithFormat:@"%ld", tempInt];
self.releaseCount = tempStr;//此处若releaseCount在申明的时候retain的话,则self.releaseCount也就retain了。
[tempStr release]; 已经释放,即代表self.releaseCount 指为空
NSLog(@"----after---- (%ld) -- (%ld) -- (%ld)",[tempStr retainCount], [_releaseCount retainCount] , [self.releaseCount retainCount]);此处用到了self.releaseCount,故立刻奔溃。
}结论:上面的程序会奔溃,因为releaseCount申明的为assign类型,这边的self.releaseCount = tempStr; 不会retain。
2. 申明为ratain 类型的self.releaseCount
倘若将1中的@property(nonatomic,assign) NSString *releaseCount; 改变为@property(nonatomic,retain) NSString *releaseCount; {注意:申明为retain后,self.releaseCount赋值后,就需要在dealloc中将其释放。}
此时这边的self.releaseCount = tempStr; 就会retain。然后1中得代码就不会奔溃。
3. retain 与release ,self.
if (![_targetName isEqual:q]) {
[_targetName release];
_targetName = [q retain]; _targetName申明的时候是retain类型,等号两端需要类型一致
上面2行得意思等于下面的一行的意思
self.targetName = q; _targetName申明的时候是retain类型,所以此处的self.targetName依旧代表了retain
_targetName = q; //assgin 错误写法
}
4. 通过打印数据,当把常量赋值给self.targetName时,retainCount 为-1或者很大的值(代表由系统去做控制)