objective-c - 一些初学 Objective-C/iPhone 的问题

标签 objective-c iphone

我才刚刚起步(过去几天阅读了大量书籍)。这是我整理的一些问题,希望有人能回答。

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 添加到最近的包装“自动释放池”的方法,它将释放它?基本上,一些避免自己释放它的魔法?为什么要使用它?

好吧,现在就是这样。感谢您的回答!

最佳答案

  1. 在 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

  2. 您可能必须释放静态方法的返回值。您应该阅读 Cocoa 内存管理 guide .规则通常很简单:如果您调用的方法的签名中有“new”、“alloc”或“copy”,则结果属于调用者,调用者必须调用 -release该实例,否则将发生内存泄漏。当然你应该调用 -retain 任何你想保持引用的其他东西(即不是来自“alloc”,“new”或“copy”方法)然后调用 -release -autorelease 当您完成该实例时。

  3. str = @"Hi there!",假设 str 声明为 NSString *str; 分配地址字符串常量 @"你好!"到 str变量的值。您不需要保留或释放字符串常量。str = [[NSString alloc] initWithString:@"Hi there!"];分配一个新的字符串实例。 str 的值将是这个实例的地址。每次调用 str = [[NSString alloc] initWithString:@"Hi there!"]; 将再次分配一个新实例。所以 afterstr2 = [[NSString alloc] initWithString:@"Hi there!"];,str != str2, 而 afterstr2 = @"Hi那里!”,str==str2。参见 this也回答一下。

  4. -autorelease 将接收器添加到当前 NSAutoreleasPool。当池被排空时(通常在当前运行循环迭代结束时,或者当池被手动排空时),池在池中的所有实例上调用 -release。如果此 -release 将保留计数降为 0,则对象将被释放(并调用 -dealloc),就像任何其他 -release 一样。在 iPhone 上使用自动释放池通常是不受欢迎的,因为它可能会导致您在池中积累许多未使用的实例,然后在运行循环迭代结束时将其耗尽。如果您可以使用 -release 而不是 -autorelease,您通常应该这样做。再次,参见 Cocoa 内存管理 guide获取更多信息。

关于objective-c - 一些初学 Objective-C/iPhone 的问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/710568/

相关文章:

ios - 上面两个UIView的UIButton没有被按下

objective-c - 将 GPS 坐标映射到图像并在其上绘制一些 GPS 点

ios - 发送 POST 到 HTML 网站

iphone - iOS : Date format - 20-Sep-2012

objective-c - 在不知道 First Responder 的情况下隐藏 iPhone 上的输入键盘?

iphone - 已经购买了付费应用程序的客户在应用程序商店中通过应用内购买将其升级为免费应用程序时会怎样?

ios - KVO 在 UITableView 中观察模型变化的最佳实践

ios - 更新了核心数据并发文档?

iphone - 如何从 iPhone 上的来电中获取来电者的电话号码

iphone - UIImagePickerController 呈现在 View 内