- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我正在努力思考 NSString 和 NSMutableString,以及它们如何影响内存。
在我的研究中,我得出的结论是,如果我创建一个 NSString 对象并为其赋值,然后稍后更改该值,则原始对象将被另一个具有新值的对象替换。
我的问题是,在更改 NSString 的值的情况下。当 NSString 的值发生变化,指向的对象被新对象替换时,原来的对象会发生什么变化?这是内存泄漏吗?
谢谢! V
最佳答案
NSString
可以包含字符串文字,它们是编译时常量,以及字符串对象,它们在运行时动态实例化。
对于字符串文字,没有动态实例化,因此它们不会在运行时影响内存。将文字值分配给 NSString
变量
NSString *myString = @"string1";
然后分配另一个字面值
myString = @"string2";
不会对可用内存量进行任何更改。
如果是字符串对象,内存确实会发生变化。如果你有一个 NSString
类型的变量,并为它分配一个动态字符串,例如
NSString *myString = [NSString stringWithFormat:@"String %d", 1];
一个新的 NSString
实例被分配,用提供的字符串初始化,并分配给 myString
变量。
如果稍后您分配一个新的动态值
myString = [NSString stringWithFormat:@"String %d", 2];
创建了一个新的 NSString
实例,但它不会替换旧实例。两者都被实例化并在内存中。
当通过第一个 NSString
实例使用 ARC 时,如果不再引用,将因为未被使用而被释放。这是自动处理的,因此无需通过代码执行任何操作。
也许您对新旧实例有时会使用内存这一事实更感兴趣 - 但在未使用的实例被释放之前这是暂时的。
为了回答您的问题,不,没有内存泄漏。字符串文字会在整个应用程序生命周期内持续存在,因为它们是常量。 String 对象的分配和释放(释放),释放由 ARC 自动处理。
当然这是一个适用于任何动态实例化类的通用概念,而不仅仅是 NSString
- 但不适用于原始数据类型(int、boolean、float 等),因为这些类型的变量保存实际值,而不是指向值所在内存区域的指针。如果您想知道,原始数据类型不会产生内存泄漏。
关于ios - NSString 和 NSMutableString 内存注意事项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22019727/
NSMutableString *str, *str1; //这里分配 我正在使用[str appendString:str1] 不工作。[str appendFormat:str1] 不工作。 那么
@property (nonatomic, weak) id a; @property (nonatomic, weak) id sa; 我有两个弱点。数组将在复制后释放。但是 NSString 没有
我有一个相当大的循环,它获取一个字符串,对其执行一些操作,然后再进入下一个循环。我最初是释放它然后重新分配它,但认为这有点浪费资源,但不知道如何清除它以重用它。 最佳答案 一种方法是[myString
我有为 MD5 munge 准备消息的 java 代码 private static char[] jimsCopyRight = { 'C'、'o'、'p'、'y'、'r'、'i'、'g'、'h'、
我有这个代码: NSMutableString *printHead = [NSMutableString stringWithFormat:@"%@, %@", firstTextField.tex
我在M文件开头声明了一个对象如下: NSMutableString *SomeString; 在一个方法中我尝试初始化它: SomeString = [NSMutableString stringW
我想创建一个字符串。根据条件,我必须附加一些额外的字符串。在这种情况下,首选使用哪个?是根据条件创建两个不同的字符串还是创建可变字符串以根据条件附加新字符串? 前 if(a==1) { Str
一直在玩弄仪器,但运气不太好,无法弄清楚如何解决此内存泄漏问题。 首先是代码: -(NSString *) randomizeHint:(NSString *) wordToShuffle{
我有以下将字符串数组转换为字符串的代码 -(NSString *) arrayToString:(NSMutableArray *) array { NSMutableString *strF
我制作了一个包含几个单词的数组,然后我将所有单词放入一个可变字符串中,然后将这个字符串的每个字符放入一个可变数组中。然而,“wordSplitted”是一个可变的字符数组,在模拟器中每次启动应用程序时
我在使用谓词过滤数组时遇到问题。我的代码是这样的: NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,
我正在尝试构建一个字符串数组,该数组将添加到 XML soap 请求中。 我有一个简单的循环来构建数组: MarcTagsList 是一个 NSArray 字符串,它包含值 ["82a","100a"
NSMutableString *str = [[NSMutableString alloc] init]; 假设 str 有权知道一个值“me”。 并且在单击按钮时我希望 str 的值被重置。即字符
我是 objective-c 的绝对新手 使用此代码 NSMutableString *teststring; [teststring appendString:@"hey"]; NSLog(test
将 Swift String 转换为 NSString 效果很好。 let string = "some text" let nsString = string as NSString 但是当我这样做
我知道类似的问题已经被一次又一次地问到,但我请求您耐心等待,因为我似乎找不到有帮助的答案。 我的应用程序存在漏洞,这让我抓狂。实际上,使用 Leaks 不会将它们报告为泄漏,但 ObjectAlloc
我正在使用 XMLParser 来解析一些 XML 数据,它使用 NSMutableString *resultString 来存储标记字符。在每个 (- parser: didStarElement
我以字典格式的形式向 nsmutablestring 添加一些文本内容,并且每个字典都由“,”(commos)分隔。但是当获取这个总字符串时,它会显示 (,) 到结尾的字符串。那么如何删除该可变字符串
我有一个很大的 NSMutableString(可能有数百兆字节),需要对其执行大量 rangeOfCharacterFromSet: 操作。 为了提高性能,我想让一个 NSOperationQueu
我有以下代码 NSMutableString *ibmcountryCodeLabel=[[NSMutableString alloc]init]; NSMutableString *imobileN
我是一名优秀的程序员,十分优秀!