1、空指针、野指针、僵尸对象
1>.空指针
1> 没有存储任何内存地址的指针就称为空指针(NULL指针)
2> 空指针就是被赋值为0的指针,在没有被具体初始化之前,其值为0。
下面两个都是空指针:
1 Student *s1 = NULL; 2 3 Student *s2 = nil;
2>.野指针
"野指针"不是NULL指针,是指向"垃圾"内存(不可用内存)的指针。野指针是非常危险的。
3>.僵尸对象
http://www.cnblogs.com/mjios/archive/2013/04/22/3034788.html
2、@property (strong, nonatomic) NSString *name; 相当于
- (void)setName:(NSString *)name;
- (NSString *)name;
@synthesize 相当于生成了:
- (void)setName:(NSString *)name
{
if (_name != name) {
[_name release];
_name = [name retain];
}
}
- (NSString *)name
{
return _name;
}
实际strong属性的内存管理就是这样的。
3、一个值得研究一下的问题
在dealloc中
-(void)dealloc
{
self.test = nil;
[_test release];
test = nil;
}
这几个的区别:
先说最简单的
再说self.test = nil;说明一下 属性和setter和getter方法就不难理解了
-(void)setTest:(NSString *)newString
{
if(_test != newString)
[_test release];
_test = [newString retain];
}
-(NSString *)test
{
return
}
这个是setter和getter方法,而在这个问题中相当于刚才的代码改变为
if(_test != nil)
[_test release];
_test = nil;
现在就比较容易解释了,setter方法会retain nil对象,在这之前已经先release了旧的对象,这个方法优点是成员变量连指向随机数据的机会都没有,而通过别的方式,就可能会出现指向随机数据的情况。当release了之后,万一有别的方法要用要存取它,如果它已经dealloc了,可能就会crash,而指向nil之后,就不会发生错误了。nil说白了就是计数器为0,这么说吧,当真正release一个对象的时候,NSLog是打印不了它指向的内存控件的,而当nil的时候,是可以打印出来指向的一个内存空间。
那么现在也不难解释test = nil;
3、Block的一些特别用法:
block对于其变量都会形成strong reference,对于self也会形成strong reference ,而如果self本身对block也是 strong reference 的话,就会形成 strong reference 循环,造成内存泄露,为了防止这种情况发生,在block外部应该创建一个week(__block) reference。
所以在block内如果有self的话,一般都会在block外面加一句_block typeof(self)bself = self;
__block typeof(self) bself = self;
[self methodThatTakesABlock:^ {
[bself doSomething];
}