Ios Objective-C对象在释放后存在于内存中
我正在学习objective-c内存管理的东西(没有ARC),我遇到了一些常见的问题。这里已经提到过好几次了,所以我不是问你“到底是什么?”而是“我理解正确吗?” 问题: 文件说: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
- (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