我正在慢慢地教自己可可用于iPhone(通过iTunes U上的斯坦福大学课程),我刚刚完成了关于内存管理的部分,我希望能够得到一些确认,即我对内存的假设处理以及[release]和[autorelease]如何工作.由于内存管理是编程体验中一个非常基础和基础但非常重要的部分,我想确保我做得对.
我知道需要释放任何带有alloc,new或copy的东西.
如果我这样做:
NSString *temp = [[NSString alloc] initWithString:@"Hello World"];
Run Code Online (Sandbox Code Playgroud)
然后我需要最终添加[temp release/autorelease],因为我有一个alloc.
但是,如果我这样做:
NSString *temp = @"Hello World";
Run Code Online (Sandbox Code Playgroud)
然后它似乎不需要发布声明.作为赋值的一部分,NSString类是否自动调用autorelease?
另外,在这些语句之后,这两个*temp对象之间有什么区别吗?它们都包含相同的字符串,但它们有不同的内存/使用方式吗?
其次,对于属性,我假设自动处理自动释放.如果我有这个:
@interface Person : NSObject
{
//ivars
NSString *firstName;
NSString *lastName;
}
//properties
@property NSString *firstName;
@property NSString *lastName;
///next file
@implementation Person
@synthesize firstName;
@synthesize lastName;
- (void) dealloc
{
//HERE!!!!
[super dealloc];
}
Run Code Online (Sandbox Code Playgroud)
我假设我不需要添加[firstName release]和[lastName release](在// HERE !!!!),因为这是由属性自动处理的.那是对的吗?
我明白如果我在代码中这样做(假设我已经定义了initWithFirstName):
Person *Me = [[Person alloc] initWithFirstName: @"Drew", lastName:"McGhie"];
Run Code Online (Sandbox Code Playgroud)
以后我将不得不使用[我发布/自动发布];
到目前为止,任何确认或纠正我的理解的帮助都非常感谢.
POST ANSWER WRITE-UP
我认为在完成所有答案并测试建议并谈论有效之后我会写完这一切. …
当我需要一个临时使用的数组时,它们之间有什么区别:
1:
NSMutableArray *stuff = [[NSMutableArray alloc] init];
// use the array
[stuff release];
Run Code Online (Sandbox Code Playgroud)
2:
NSMutableArray *stuff = [NSMutableArray array];
// use the array
Run Code Online (Sandbox Code Playgroud)
3:
NSMutableArray *stuff = [[[NSMutableArray alloc] init] autorelease];
// use the array
Run Code Online (Sandbox Code Playgroud)
我更喜欢2号,因为它更短.有没有充分的理由使用1号或3号?