【问题标题】:Xcode confusion - property and synthesize, retain?Xcode混淆-属性和合成,保留?
【发布时间】:2011-11-29 07:46:45
【问题描述】:

我在没有先“声明变量”的情况下看到使用了属性和合成。我对使用哪些属性有点困惑。我想在 AppDelegate 中分配和初始化我的 viewController,然后确保它在剩余的运行中存在。显然我想要保留属性? 但是.. 由于 alloc 返回保留计数为 1 的 viewController,因此仅使用保留属性会更智能。没有其他班级会使用我的 setter,所以我不在乎?

例如

在 AppDelegate.h 中:

    @propert(nonatomic,retain) MyViewController *myViewController;

在 AppDelegate.m 中:

    @synthesize myViewController = _myViewController;
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        self.myViewController = [[[EventDataController alloc] init] autorelease];
        [self.window makeKeyAndVisible];
        return YES;
    }

或者..

在 AppDelegate.h 中:

    @propert(nonatomic) MyViewController *myViewController;

在 AppDelegate.m 中:

    @synthesize myViewController = _myViewController;
    - (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions
    {
        self.myViewController = [[EventDataController alloc] init];
        [self.window makeKeyAndVisible];
        return YES;
    }

请让我直截了当。

【问题讨论】:

    标签: iphone xcode properties retain init


    【解决方案1】:

    在选项中,我更喜欢用retain 声明属性。这是为您准备的文档,它可以帮助您避免因静态分析等工具而犯的愚蠢错误。由于您的类拥有控制器,因此应该声明它持有对它的引用,而不管实现细节如何。偏离传统习语是引入错误的好方法。您还应该将其声明为readonly

    【讨论】:

      【解决方案2】:

      我会选择第一个选项。

      为什么你不能在完成后显式释放myViewController

      我不会做出“其他人永远不会使用这个类”之类的假设。

      【讨论】:

      • 在 appDelegate dealloc 方法中放任何东西是没有意义的。那时没有必要,Apple 甚至可能都懒得调用 appDelegate dealloc 方法,这完全是浪费时间。
      • 您能否提供支持这一假设的参考资料?
      • 想通了。答案已调整。
      【解决方案3】:

      您不再需要为属性定义实例变量 - @synthesize 为您完成。

      至于您的其他问题 - 您可以采用任何一种方式,但不要忘记在您的 -dealloc 中发布它。我喜欢(nonatomic, retain),因为它非常清晰且易于使用/理解。您所做的只是分配,其余的由它完成:

      self.myViewController = [[[ViewController alloc] init] autorelease];
      

      在你的-dealloc

      self.myViewController = nil;
      

      在手动释放的情况下,您可能希望完全忘记属性,而只使用这样的实例变量:

      @interface MyClass: NSObject
      {
        ViewController* _myViewController;
      }
      @end
      

      在您的实施中:

      _myViewController = [[ViewController alloc] init];
      

      在你的-dealloc:

      [_myViewController release];
      _myViewController = nil;
      

      请注意,nil 的最后分配可能是不必要的,但我有太多难以跟踪的错误(这就是我喜欢保留属性的原因 - 你需要做的就是将它们设置为 nil )。

      我尝试始终使用保留属性,因为这可以节省一些大脑周期,而且我不在乎我可以为 CPU 节省多少纳秒。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-03
        • 2012-02-18
        • 2011-04-01
        • 1970-01-01
        相关资源
        最近更新 更多