Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/102.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios Objective-C对象在释放后存在于内存中_Ios_Objective C_Memory Management - Fatal编程技术网

Ios Objective-C对象在释放后存在于内存中

Ios Objective-C对象在释放后存在于内存中,ios,objective-c,memory-management,Ios,Objective C,Memory Management,我正在学习objective-c内存管理的东西(没有ARC),我遇到了一些常见的问题。这里已经提到过好几次了,所以我不是问你“到底是什么?”而是“我理解正确吗?” 问题: 文件说: - (NSString *)fullName { NSString *string = [[[NSString alloc] initWithFormat:@"%@ %@", self.firstName, self.la

我正在学习objective-c内存管理的东西(没有ARC),我遇到了一些常见的问题。这里已经提到过好几次了,所以我不是问你“到底是什么?”而是“我理解正确吗?”

问题:

文件说:

- (NSString *)fullName {

    NSString *string = [[[NSString alloc] initWithFormat:@"%@ %@",

                                          self.firstName, self.lastName] autorelease];

    return string;

}
您拥有alloc返回的字符串。遵守记忆 管理规则,则必须在 你失去了对它的引用但是,如果使用release,字符串 将在返回之前解除分配(并且该方法将返回 无效对象)。使用自动释放,表示您想要 放弃所有权,但允许方法的调用方使用 释放前返回的字符串

让我们试试:

// Method defined in one on my class:
-(NSString*) returnString {
    NSString* str = [[NSString alloc] initWithString:@"returned String"]; 
    NSLog(@"1) Address in method = %p", [str self]);
    [str release];
    NSLog(@"2) Address in method = %p", [str self]);
    return str; 
 }

// In main: 
        NSString* str = [myObject returnString];
        NSLog(@"String is: [%@]", str);
        NSLog(@"3) Address in main = %p", [str self]);
-

输出:
1) 方法中的地址=0x100002a50
2) 方法中的地址=0x100002a50

字符串是:[返回的字符串]/
NSString
在许多情况下都非常聪明地避免分配/解除分配。这使得它对于测试释放和学习Objective C中的内存管理语义来说是一个非常糟糕的选择

在本例中,您是从一个文本中分配一个对象(该文本永远不会被释放)。因为新初始化的对象是不可变对象的副本,所以初始值设定项只返回文本(同样,它永远不会被释放)

例如,您应该使用
NSObject
或自定义派生类来测试释放

另一个很好的帮助是启用zombies,因为这样可以确保您立即注意到对解除分配对象的第一次访问

所以,如果我理解的很好,问题是,很难预测 什么时候会释放内存

嗯,对象生存期是完全确定的(当不使用不推荐使用的MacOSX垃圾收集器时)。唯一的问题是自动释放池:您通常不知道对象是否自动释放,因此您无法猜测它是否比您预期的寿命更长

NSString *str1 =@"parag";
NSString*str2=[[NSString alloc] initWithString:@"parag"];
NSLog(@"%p %p", str1, str2); //str1 and str2 both are same  
  //  0x100002098 0x100002098
这与内部优化有关。你必须释放str2


注意:这依赖于编译器和initWithString:方法的未记录且不保证的行为。两者都可能在任何时候发生变化。

它被释放,只是幸运的是没有再次被分配到yetEdited。吉他怪胎,咒骂不属于Stackoverflow。有关更多信息,请参阅。@occulus我没有注意到这一点。感谢您的编辑。第一句话+1;)但为什么苹果不使用某些NSOBject示例:D@guitar_freak因为正确的内存管理仍然适用于
NSString
以及任何其他对象
NSString
只是有时候不会在预期的情况下崩溃。旁注:Apple示例中的字符串的行为可能与普通对象类似,因为它不是从文本构造的。需要补充的是,这依赖于编译器和
initWithString:
方法的未记录且不保证的行为。两者都可能在任何时候发生变化。
NSString *str1 =@"parag";
NSString*str2=[[NSString alloc] initWithString:@"parag"];
NSLog(@"%p %p", str1, str2); //str1 and str2 both are same  
  //  0x100002098 0x100002098