当前位置:  开发笔记 > IOS > 正文

一些初学者Objective-C/iPhone问题

如何解决《一些初学者Objective-C/iPhone问题》经验,为你挑选了1个好方法。

我刚开始(过去几天读了很多).这是我堆积的一些问题,希望有人可以回答.

1.(self!= nil)检入初始化代码.为什么这样?为了防止意外访问包含在那里的一些"只运行一次"代码?从哪里来的意外访问来自?做这样的检查表明我无法控制正在发生的事情.

- (id)init {
    self = [super init]
    if (self != nil) {
    // Code..
    }
    return self;
}

str = [[NSString alloc] initWithString:@"Hi there!"];

据我所知,你必须用第二种方法释放str,但不是先用?如果是这样,第一个什么时候发布?哪一个更好(不打算打字长度)?

4.什么是autorelease,如果iPhone没有垃圾收集?我注意到在main.m中创建了一个名为"自动释放池"的东西.是[myObject autorelease]; 一种将myObject添加到最近的包装"自动释放池"的方法,它将释放它?基本上,一些魔法,以避免自己释放它?为什么要用它?

好吧,现在就是这样.谢谢你的回答!



1> Barry Wark..:

    在Objective-C中,可以返回除self之外的实例-init.例如,类执行此操作以强制执行单例实例,或者在类集群的情况下执行此操作.NSNumber例如,根据传递给其初始值设定项的值的类型返回子类.所以,当你打电话[[NSNumber alloc] initWithLong:long_value],NSNumber-initWithLong:初始值设定后称为NSNumberS' +alloc,但子类NSNumber可以被返回给调用者oringial.因此模式

    self = [super init];

    它重新分配self给值,[super init]以便self指向[super init]返回的实际实例.如果+alloc或者超级init方法失败,结果[super init]可能是nil.为了避免在初始化失败的情况下产生副作用,模式就变成了

    - (id) init {
      if(self = [super init]) {
        // do initialization of instance variables etc.
      }
    
      return self;
    }
    

    请注意,您必须从方法返回self(或nil其他实例)init.您应该指定自己,[super init]并且可以nil在做更多工作之前检查.

    您可能必须释放staic方法的返回值.您应该阅读Cocoa内存管理指南.规则通常很简单:如果您调用的方法在其签名中具有"new","alloc"或"copy",则结果属于调用者,调用者必须调用-release该实例或者存在内存泄漏.当然,您应该调用-retain其他任何内容(即不是来自"alloc","new"或"copy"方法),您希望保留引用,然后调用-release-autorelease完成该实例.

    str = @"Hi there!",假设str被声明为NSString *str;赋值字符串的地址常量@"Hi there!" to the value of thestr variable. You do not need to retain or release string constants.str = [[NSString alloc] initWithString:@"Hi there!"]; allocates a new string instance. The value ofstr will be the address of this instance. Each call ofstr = [[NSString alloc] initWithString:@"Hi there!"]; again will allocate a new instance. So afterstr2 = [[NSString alloc] initWithString:@"Hi there!"]; ,海峡!= str2的, while afterSTR2 = @ "你好!", str==str2.也请参阅此答案.

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

推荐阅读
php
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有