我才刚刚起步(过去几天阅读了大量书籍)。这是我整理的一些问题,希望有人能回答。
1. (self != nil) 检查初始化代码。为什么要这样做?为了防止意外访问一些包含在其中的“只运行一次”的代码?这种意外访问从何而来?进行此类检查表明我无法控制正在发生的事情。
- (id)init {
self = [super init]
if (self != nil) {
// Code..
}
return self;
}
2. 为什么不必释放静态方法返回的任何内容? (或者这是我的想法)
3. str = @"嗨,你好!"不同于
str = [[NSString alloc] initWithString:@"Hi there!"];
据我了解,您必须使用第二种方法释放 str in aquired,而不是使用第一种方法?如果是这样,第一个什么时候发布?哪一个更可取(不考虑打字长度)?
4. 如果 iphone 没有垃圾回收,什么是自动释放?我注意到在 main.m 中创建了一个叫做“自动释放池”的东西。是 [myObject autorelease];一种将 myObject 添加到最近的包装“自动释放池”的方法,它将释放它?基本上,一些避免自己释放它的魔法?为什么要使用它?
好吧,现在就是这样。感谢您的回答!
最佳答案
在 Objective-C 中,可以从
-init
返回一个实例而不是 self。例如,类这样做是为了强制执行单例实例,或者在类集群的情况下。NSNumber
,例如,根据传递给它的初始化器的值的类型返回一个子类。所以当你调用[[NSNumber alloc] initWithLong:long_value]
时,NSNumber
的-initWithLong:
初始化器在NSNumber<之后被调用
的+alloc
,但NSNumber
的子类可能会返回给原始调用者。因此模式self = [ super 初始化];
将
self
重新分配给[super init]
的值,以便self
指向[super init] 的实际实例]
返回。如果+alloc
或者super的init
方法失败,[super init]
的结果可能是nil
。为了避免在初始化失败的情况下产生副作用,模式变为- (id) init { if(self = [super init]) { // do initialization of instance variables etc. } return self; }
请注意,您必须从
init
方法返回self
(或nil
或其他实例)。您应该将 self 分配给[super init]
,并且您可以在做更多工作之前检查nil
。您可能必须释放静态方法的返回值。您应该阅读 Cocoa 内存管理 guide .规则通常很简单:如果您调用的方法的签名中有“new”、“alloc”或“copy”,则结果属于调用者,调用者必须调用
-release
该实例,否则将发生内存泄漏。当然你应该调用-retain
任何你想保持引用的其他东西(即不是来自“alloc”,“new”或“copy”方法)然后调用-release
或-autorelease
当您完成该实例时。str = @"Hi there!"
,假设str
声明为NSString *str;
分配地址字符串常量@"你好!"到
str变量的值。您不需要保留或释放字符串常量。
str = [[NSString alloc] initWithString:@"Hi there!"];分配一个新的字符串实例。
str的值将是这个实例的地址。每次调用
str = [[NSString alloc] initWithString:@"Hi there!"];将再次分配一个新实例。所以 after
str2 = [[NSString alloc] initWithString:@"Hi there!"];,
str != str2, 而 after
str2 = @"Hi那里!”,str==str2
。参见 this也回答一下。-autorelease
将接收器添加到当前NSAutoreleasPool
。当池被排空时(通常在当前运行循环迭代结束时,或者当池被手动排空时),池在池中的所有实例上调用-release
。如果此-release
将保留计数降为 0,则对象将被释放(并调用-dealloc
),就像任何其他-release
一样。在 iPhone 上使用自动释放池通常是不受欢迎的,因为它可能会导致您在池中积累许多未使用的实例,然后在运行循环迭代结束时将其耗尽。如果您可以使用-release
而不是-autorelease
,您通常应该这样做。再次,参见 Cocoa 内存管理 guide获取更多信息。
关于objective-c - 一些初学 Objective-C/iPhone 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/710568/