nsstringwin10内存占用多少少内存

iOS深拷贝与浅拷贝、NSString内存分配
copy与retain的区别:
1)copy是创建一个新对象,retain是创建一个指针,引用对象计数加1。Copy属性表示两个对象内容相同,新的对象retain为1 ,与旧有对象的引用计数无关,旧有对象没有变化。
copy与retain的区别:
1)copy是创建一个新对象,retain是创建一个指针,引用对象计数加1。Copy属性表示两个对象内容相同,新的对象retain为1 ,与旧有对象的引用计数无关,旧有对象没有变化。copy减少对象对上下文的依赖。
2)retain属性表示两个对象地址相同(建立一个指针,指针拷贝),内容当然相同,这个对象的retain值+1也就是说,retain 是指针拷贝,copy 是内容拷贝。
#pragma mark - iOS系统的集合类与非集合类的retain和copy
NSString *str1 = [[NSString alloc] initWithFormat:@"%@", @"Jacedy"];
NSString *str11 = [str1 retain];
NSString *str12 = [str1 copy];
NSString *str13 = [str1 mutableCopy];
NSMutableString *str2 = [[NSMutableString alloc] initWithString:@"Jake"];
NSMutableString *str21 = [str2 retain];
NSMutableString *str22 = [str2 copy];
NSMutableString *str23 = [str2 mutableCopy];
NSLog(@"非容器类");
NSLog(@"str1 的地址:%p,retainCount:%lu", str1, (unsigned long)[str1 retainCount]);
NSLog(@"str11的地址:%p,retainCount:%lu", str11, (unsigned long)[str11 retainCount]);
NSLog(@"str12的地址:%p,retainCount:%lu", str12, (unsigned long)[str12 retainCount]);
NSLog(@"str13的地址:%p,retainCount:%lu\n\n", str13, (unsigned long)[str13 retainCount]);
NSLog(@"str2 的地址:%p,retainCount:%lu", str2, (unsigned long)[str2 retainCount]);
NSLog(@"str21的地址:%p,retainCount:%lu", str21, (unsigned long)[str21 retainCount]);
NSLog(@"str22的地址:%p,retainCount:%lu", str22, (unsigned long)[str22 retainCount]);
NSLog(@"str23的地址:%p,retainCount:%lu\n\n", str23, (unsigned long)[str23 retainCount]);
NSArray *arr1 = [NSArray arrayWithObjects:@"one", @"two", nil];
NSArray *arr11 = [arr1 retain];
NSArray *arr12 = [arr1 copy];
NSArray *arr13 = [arr1 mutableCopy];
NSMutableArray *arr2 = [NSMutableArray arrayWithObjects:@"one", @"two", nil];
NSMutableArray *arr21 = [arr2 retain];
NSMutableArray *arr22 = [arr2 copy];
NSMutableArray *arr23 = [arr2 mutableCopy];
NSLog(@"容器类");
NSLog(@"arr1 的地址:%p,retainCount:%lu", arr1, (unsigned long)[arr1 retainCount]);
NSLog(@"arr11的地址:%p,retainCount:%lu", arr11, (unsigned long)[arr11 retainCount]);
NSLog(@"arr12的地址:%p,retainCount:%lu", arr12, (unsigned long)[arr12 retainCount]);
NSLog(@"arr13的地址:%p,retainCount:%lu", arr13, (unsigned long)[arr13 retainCount]);
NSLog(@"arr1[0] :%p", arr1[0]);
NSLog(@"arr13[0]:%p\n\n", arr13[0]);
NSLog(@"arr2 的地址:%p,retainCount:%lu", arr2, (unsigned long)[arr2 retainCount]);
NSLog(@"arr21的地址:%p,retainCount:%lu", arr21, (unsigned long)[arr21 retainCount]);
NSLog(@"arr22的地址:%p,retainCount:%lu", arr22, (unsigned long)[arr22 retainCount]);
NSLog(@"arr23的地址:%p,retainCount:%lu", arr23, (unsigned long)[arr23 retainCount]);
NSLog(@"arr2[0] :%p", arr2[0]);
NSLog(@"arr22[0]:%p\n\n", arr22[0]);
#pragma mark - NSString 内存管理
NSString *string1 = @"Jacedy";
NSString *string2 = [[NSString alloc] initWithString:@"KJacedy"];
NSString *string3 = [[NSString alloc] initWithFormat:@"Jacedy"];
NSString *string4 = [NSString stringWithFormat:@"K-Jacedy"];
NSLog(@"NSString内存管理");
NSLog(@"string1:%p retainCount:%lu
class:%@", string1, [string1 retainCount], [string1 class]);
NSLog(@"string2:%p retainCount:%lu
class:%@", string2, [string2 retainCount], [string2 class]);
NSLog(@"string3:%p retainCount:%lu
class:%@", string3, [string3 retainCount], [string3 class]);
NSLog(@"string4:%p retainCount:%lu
class:%@\n\n", string4, [string4 retainCount], [string4 class]);
str1 的地址:0xa65,retainCount:
str11的地址:0xa65,retainCount:
str12的地址:0xa65,retainCount:
str13的地址:0x,retainCount:1
str2 的地址:0x,retainCount:2
str21的地址:0x,retainCount:2
str22的地址:0x656b614a45,retainCount:
str23的地址:0x,retainCount:1
arr1 的地址:0x,retainCount:3
arr11的地址:0x,retainCount:3
arr12的地址:0x,retainCount:3
arr13的地址:0x,retainCount:1
arr1[0] :0x
arr13[0]:0x
arr2 的地址:0x,retainCount:2
arr21的地址:0x,retainCount:2
arr22的地址:0x,retainCount:1
arr23的地址:0x,retainCount:1
arr2[0] :0x
arr22[0]:0x
NSString内存管理
string1:0x retainCount:
class:__NSCFConstantString
string2:0x retainCount:
class:__NSCFConstantString
string3:0xa65 retainCount:
class:NSTaggedPointerString
string4:0xd2eec retainCount:
class:NSTaggedPointerString
Program ended with exit code: 0
深拷贝与浅拷贝结论:
1)对非集合类:
[immutableObject copy] // 浅复制
[immutableObject mutableCopy] //深复制
[mutableObject copy] //深复制
[mutableObject mutableCopy] //深复制
2)对集合类:
[immutableObject copy] // 浅复制
[immutableObject mutableCopy] //单层深复制(即仅对对象本身进行深复制,对象元素仍是浅复制(指针拷贝,内存地址不变))
[mutableObject copy] //单层深复制
[mutableObject mutableCopy] //单层深复制
NSString内存分配结论:
@“” 和 initWithString:方法生成的字符串分配在常量区,系统自动管理内存;
initWithFormat:和 stringWithFormat: 方法生成的字符串分配在堆区,autorelease
版权声明:本文内容由互联网用户自发贡献,版权归作者所有,本社区不拥有所有权,也不承担相关法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件至: 进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容。
用云栖社区APP,舒服~
【云栖快讯】新年大招!云栖社区为在读大学生/研究生准备了一份学(huan)习(zhuang)攻略,发布博文即有机会赢得iPad mini 4等大奖,学习换装两不误!欢迎报名参与~&&
一种高性能、高可靠、可平滑扩容的分布式内存数据库服务。
一个稳定可靠的集中式访问控制服务。您可以通过访问控制将阿里云资源的访问及管理权限分配给您的企业成员或合作伙伴。
移动测试(Mobile Testing)是为广大企业客户和移动开发者提供真机测试服务的云平台,拥有大量热门机型,...
为您提供简单高效、处理能力可弹性伸缩的计算服务,帮助您快速构建更稳定、安全的应用,提升运维效率,降低 IT 成本...
2017阿里千余份技术干货大盘点
Loading...关于NSString内存泄漏
昨天从网上看了个关于NSString内存泄漏的问题,具体问题如下(完全复制提问者的问题):
& NSString *str =[[NSString
alloc]initWithString:@"4321"];
& str = @"123";
NSLog(@"%@",str);
&&[str release];
按照我的理解,str指针首先指向了4321分配这款内存,然后赋予了它一个常量,这个时候str应该指向123,且4321这块内存任然存在,,所以回收不到.应该内存泄露.!
可用instumenrs发现内存并没有泄露,是我哪里理解错了吗?
&&&&也看了很多人的回复,有的说一开始alloc的内存是分配到堆上,str&
@“123”是分配到栈上,反正后面的回答是五花八门啊,其实这个地方很好理解,首先Object-c是继承了C语言,无论是initWithString给str初始化,还是str
@“123”这种初始化方法,都是将str指向的是静态内存区,它们在内存中的位置是固定的,只是通过str指针进行指向而已,程序结束后会自动释放,如果我们在程序里面打印[str
retainCount],会发现值是-1,也就是说它的内存空间无限大,在这里,你是否释放,释放一次还是多次,都不会造成内存泄漏。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。nsstring 占用栈多少内存大小_百度知道
nsstring 占用栈多少内存大小
我有更好的答案
本人是你的忠实难友~~~~~~~~~ 上边说的都太占内存了,使用的内存不到4M哈哈,系统启动它几乎不需要时间,我测试过,缺点就是只能播放MP3格式(WMA不行)。
但是特点就是太小了,软件倒是不错~
我说用mp3pro,这个软件本来是为MP3PRO格式专用的软件,也能播放普通格式的MP3文件,伙计,缺内存是吧?
那你找对人了
为您推荐:
其他类似问题
换一换
回答问题,赢新手礼包
个人、企业类
违法有害信息,请在下方选择后提交
色情、暴力
我们会通过消息、邮箱等方式尽快将举报结果通知您。在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。
问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
首先看一段很简单的代码:
NSString *urlStr = @"http://120.25.226.186:32812/resources/videos/minion_10.mp4";
NSURL *url = [NSURL URLWithString:urlStr];
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
dict[url] = @"ZYCoderr";
while (1) {
NSString *value = dict[url];
运行后点击Xcode的Debug Session来看模拟器的状态: CPU占用为99%。但我想问的问题不是关于CPU的, 而是关于内存的。接下来我稍微改变一下上面的代码:
NSString *urlStr = @"http://120.25.226.186:32812/resources/videos/minion_10.mp4";
NSURL *url = [NSURL URLWithString:urlStr];
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
dict[url.absoluteString] = @"ZYCoderr";
while (1) {
NSString *value = dict[url.absoluteString];
我仅仅是改变了字典的key。再运行一遍:这是程序运行10s后的样子。我第一次注意到这个问题的时候内存已经飙到了9.9G, 鼠标几乎都快移不动了(麻麻, 编程好可怕……)
经过我多次尝试, 发现问题只出在第6行这一行身上面。当你将url.absoluteString作为你用来取值的key使用的时候, 就会发生内存暴增的问题。 就算你采取下面的写法:
NSString *key = url.absoluteS
NSString *value = dict[key];
情况仍然不可避免。但如果你直接采用下面的写法:
NSString *value = dict[urlStr];
你会发现问题又消失了。另外, 你可能会在while循环中打一个log,然后发现内存暴增的情况又“消失”了。但事实上并不是这样, 这只是while循环运行速度减慢了而已, 内存仍在稳步增长。
虽然不使用url.absoluteString当做字典的key确实可以避免这个问题, 但我还是很好奇, 到底是什么原因造成了内存的暴增?
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
试着讲清楚你的疑问。
先看absoluteString的属性声明(XCode7.3.1版本),readonly && copy,看到两个属性,应该有一种直觉,这个值是一个计算值(可参考Swift的属性声明)。
@property (readonly, copy) NSString *absoluteS
DiscussionThis property’s value is calculated by resolving the receiver’s string against its base according to the algorithm given in RFC 1808.
可以确定,absoluteString是一个计算值。如果你看过《Effective Objective-C 2.0》,那么可以再进一步,这个值是autorelease的。
autorelease的值在循环中会大量消耗内存,一般会使用autoreleasepool来降低内存峰值。
可以看下面两个测试例子
while (1) {
NSString *a = [[NSString alloc] initWithFormat:@"asdfasdfasfasdf"];
while (1) {
NSString *a = [NSString stringWithFormat:@"asdfasdfasfasdf"];
针对你的问题,稍加改动
while (1) {
@autoreleasepool {
NSString *value = dict[url.absoluteString];
可以看到,内存已经不会暴涨了。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
url.absoluteString会持续的创建新的实例,系统释放内存跟不上,打印Log的时候,系统会有一点时间去释放内存,所有内存增加稍微减缓,但是还是持续增长
同步到新浪微博
分享到微博?
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:
在 SegmentFault,学习技能、解决问题
每个月,我们帮助 1000 万的开发者解决各种各样的技术问题。并助力他们在技术能力、职业生涯、影响力上获得提升。

我要回帖

更多关于 内存占用多少正常 的文章

 

随机推荐