真心求教一个iOS堆栈的问题

lolliboy 2011-11-08 08:48:29
请问iOS的堆栈概念 和windows的有什么区别么?

另外
- (void)fun
{
NSString* str = [[NSString alloc] initWithString:@"string"];
NSLog(@"%d", [str retainCount]);
}
可以看到 str的计数器为-1

而把initWithString换成initWithFormat 计数器就是1

同事说的 NSString是很特殊的 没有计数器概念 没有retain、assign操作,
不管有没有alloc,它在内存中的存放位置 只和传给他的值有关系,
initWithString 就是放在常量区
是这样的么?
那这个alloc操作跑哪去了呢?
...全文
171 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
咸清 2011-11-09
  • 打赏
  • 举报
回复
alloc根据apple讲,是一个变量声明的产生的过程,并没有跟C一样分配空间。

1,NSString* str = [[NSString alloc] initWithString:@"string"];
2,NSString* str = [[NSString alloc] initWithFormat:@"%@",@"string"];

3,NSString* str = [NSString stringWithString:@"string"];
4,NSString* str =  @"string";
效果也不是一样滴
慢慢你会明白的。前两个跟后两个区别大,大多数情况下,1与2、3与4可以混用。

咸清 2011-11-09
  • 打赏
  • 举报
回复
@"string" 是常量,所以,它就没有开辟新的空间,仅是一个指针。initWithFormat 是要开辟空间滴⋯⋯
lolliboy 2011-11-08
  • 打赏
  • 举报
回复
谢谢你的答复哈

我不明白的是 我明明有一个alloc操作 就应该是放到堆上去了的吧,

为什么要根据initWithxxxx作出不同的操作呢,
巴依老爷 2011-11-08
  • 打赏
  • 举报
回复
没有区别.
NSString本身没有什么特殊的,这里的问题在于使用常量字符串去初始化一个NSString,而系统会对常量字符串进行优化,所有引用同一个常量字符串的NSString共享同一块内存,这块内存位于常量区,引用计数为7fffffff,表示不使用通常的引用计数管理机制,不会释放.

29,030

社区成员

发帖
与我相关
我的任务
社区描述
主要讨论与iOS相关的软件和技术
社区管理员
  • iOS
  • 大熊猫侯佩
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧