当前位置: 编程技术>移动开发
本页文章导读:
▪【Objective-C】浅谈关于nil和 null区别及相关有关问题 【Objective-C】浅谈关于nil和 null区别及相关问题
1、nil和null从字面意思来理解比较简单,nil是一个对象,而NULL是一个值,我的理解为nil是将对象设置为空,而null是将基本类型设置为空的,.........
▪ objective-c 内存储器管理的文章摘录1 objective-c 内存管理的文章摘录1
今天有空想学习一下objective-c的内存管理的知识就上网查了一些文章.下面的这种方式是不对的Instance you don’t own is sent release- (void)reset {NSNumber *zero = [NSNumber n.........
▪ 如何判断Activity是否在运行 怎么判断Activity是否在运行
在你的Activity定义一个静态变量,然后如下: class MyActivity extends Activity { static boolean active = false; public void onStart() { active = true; }
.........
[1]【Objective-C】浅谈关于nil和 null区别及相关有关问题
来源: 互联网 发布时间: 2014-02-18
【Objective-C】浅谈关于nil和 null区别及相关问题
NSURL *url = nil;
Class class = Nil;
int *pointerInt = NULL;
nil是一个对象指针为空,Nil是一个类指针为空,NULL是基本数据类型为空。这些可以理解为nil,Nil, NULL的区别吧。
2、一个可以研究一下的问题
在dealloc中
-(void) dealloc
{
self.test = nil;
[_test release];
test = nil;
}
这几个的区别
先说最简单的 [_test release]; 这个就是将引用技术减1,所谓的引用计数就是看看有多个指针指向一块内存实体,当release一次,就是指针减少一个,release到了0的时候,就是真正把这块内存归还给系统的时候了
再说self.test = nil;说明一下 属性和setter和getter方法就不难理解了
-(void) setTest:(NSString *)newString
{
if(_test != newString)
[_test release];
_test = [newString retain];
}
-(NSString *)test
{
return _test;
}
这个是setter和getter方法,而在这个问题中相当于刚才的代码改变为
if(_test != nil)
[_test release];
_test = nil;
现在就比较容易解释了,setter方法会retain nil对象,在这之前已经先release了旧的对象,这个方法优点是成员变量连指向随机数据的机会都没有,而通过别的方式,就可能会出现指向随机数据的情况。当release了之后,万一有别的方法要用要存取它,如果它已经dealloc了,可能就会crash,而指向nil之后,就不会发生错误了。nil说白了就是计数器为0,这么说吧,当真正release一个对象的时候,NSLog是打印不了它指向的内存控件的,而当nil的时候,是可以打印出来指向的一个内存空间。
那么现在也不难解释test = nil; 单纯的这种用法可以说是自己给自己制造内存泄露,这里可以这么理解,就是相当于将指向对象的指针直接和对象一刀两断了。直接让test指向nil,而内存实体不会消失,也不会有系统回收。
1、nil和null从字面意思来理解比较简单,nil是一个对象,而NULL是一个值,我的理解为nil是将对象设置为空,而null是将基本类型设置为空的,个人感觉有点像属性当中,基本类型分配为assign NSString类型一般分配copy,而对象一般用retain。而且我们对于nil调用方法,不会产生crash或者抛出异常。
看一段
nil -> Null-pointer to objective- c object
NIL -> Null-pointer to objective- c class
null-> null pointer to primitive type or absence of data.
看一下用法
Java代码
nil是一个对象指针为空,Nil是一个类指针为空,NULL是基本数据类型为空。这些可以理解为nil,Nil, NULL的区别吧。
2、一个可以研究一下的问题
在dealloc中
Java代码
这几个的区别
先说最简单的 [_test release]; 这个就是将引用技术减1,所谓的引用计数就是看看有多个指针指向一块内存实体,当release一次,就是指针减少一个,release到了0的时候,就是真正把这块内存归还给系统的时候了
再说self.test = nil;说明一下 属性和setter和getter方法就不难理解了
Java代码
这个是setter和getter方法,而在这个问题中相当于刚才的代码改变为
Java代码
现在就比较容易解释了,setter方法会retain nil对象,在这之前已经先release了旧的对象,这个方法优点是成员变量连指向随机数据的机会都没有,而通过别的方式,就可能会出现指向随机数据的情况。当release了之后,万一有别的方法要用要存取它,如果它已经dealloc了,可能就会crash,而指向nil之后,就不会发生错误了。nil说白了就是计数器为0,这么说吧,当真正release一个对象的时候,NSLog是打印不了它指向的内存控件的,而当nil的时候,是可以打印出来指向的一个内存空间。
那么现在也不难解释test = nil; 单纯的这种用法可以说是自己给自己制造内存泄露,这里可以这么理解,就是相当于将指向对象的指针直接和对象一刀两断了。直接让test指向nil,而内存实体不会消失,也不会有系统回收。
[2] objective-c 内存储器管理的文章摘录1
来源: 互联网 发布时间: 2014-02-18
objective-c 内存管理的文章摘录1
今天有空想学习一下objective-c的内存管理的知识就上网查了一些文章.
下面的这种方式是不对的
Instance you don’t own is sent release
- (void)reset {
NSNumber *zero = [NSNumber numberWithInteger:0];创建的是一个autorelease的对象
[self setCount:zero];
[zero release];//这里释放是危险的
}
When you add an object to a collection such as an array, dictionary, or set, the collection takes ownership of
it.在集合中增加object,那么这个object的所有者就变成了集合了
代码
// ...
for (i = 0; i < 10; i++) {
NSNumber *convenienceNumber = [NSNumber numberWithInteger:i];
[array addObject:convenienceNumber];
}
//这种情况不需要release
NSMutableArray *array;
NSUInteger i;
// ...
for (i = 0; i < 10; i++) {
NSNumber *allocedNumber = [[NSNumber alloc] initWithInteger: i];
[array addObject:allocedNumber];
[allocedNumber release];
}
//这种情况需要,此处只是将retain的计数减1而已
*******************************************
安全返回对象
下面两种方式是正确的
- (NSString *)fullName {
NSString *string = [NSString stringWithFormat:@"%@ %@", firstName, lastName];
return string;
}
- (NSString *)fullName {
NSString *string = [[[NSString alloc] initWithFormat:@"%@ %@", firstName,
lastName] autorelease];
return string;
}
相反,下面的方式是错误的
(NSString *)fullName {
NSString *string = [[[NSString alloc] initWithFormat:@"%@ %@", firstName,
lastName] release];
return string;
}
同样,下面的方式也是错的
(NSString *)fullName {
NSString *string = [[NSString alloc] initWithFormat:@"%@ %@", firstName,
lastName];
return string;
}
今天有空想学习一下objective-c的内存管理的知识就上网查了一些文章.
下面的这种方式是不对的
Instance you don’t own is sent release
- (void)reset {
NSNumber *zero = [NSNumber numberWithInteger:0];创建的是一个autorelease的对象
[self setCount:zero];
[zero release];//这里释放是危险的
}
When you add an object to a collection such as an array, dictionary, or set, the collection takes ownership of
it.在集合中增加object,那么这个object的所有者就变成了集合了
代码
// ...
for (i = 0; i < 10; i++) {
NSNumber *convenienceNumber = [NSNumber numberWithInteger:i];
[array addObject:convenienceNumber];
}
//这种情况不需要release
NSMutableArray *array;
NSUInteger i;
// ...
for (i = 0; i < 10; i++) {
NSNumber *allocedNumber = [[NSNumber alloc] initWithInteger: i];
[array addObject:allocedNumber];
[allocedNumber release];
}
//这种情况需要,此处只是将retain的计数减1而已
*******************************************
安全返回对象
下面两种方式是正确的
- (NSString *)fullName {
NSString *string = [NSString stringWithFormat:@"%@ %@", firstName, lastName];
return string;
}
- (NSString *)fullName {
NSString *string = [[[NSString alloc] initWithFormat:@"%@ %@", firstName,
lastName] autorelease];
return string;
}
相反,下面的方式是错误的
(NSString *)fullName {
NSString *string = [[[NSString alloc] initWithFormat:@"%@ %@", firstName,
lastName] release];
return string;
}
同样,下面的方式也是错的
(NSString *)fullName {
NSString *string = [[NSString alloc] initWithFormat:@"%@ %@", firstName,
lastName];
return string;
}
[3] 如何判断Activity是否在运行
来源: 互联网 发布时间: 2014-02-18
怎么判断Activity是否在运行
在你的Activity定义一个静态变量,然后如下: class MyActivity extends Activity {
static boolean active = false;
public void onStart() {
active = true;
}
public void onStop() {
active = false;
}
}
最新技术文章: