storyboardWithName:bundle:是为stoyboard对象分配内存吗?

时间:2016-06-06 12:54:14

标签: ios memory memory-management uistoryboard allocation

让我们说

NSNumber *number =[[NSNumber alloc] numberWithInetger] 

编辑上面的行应该是:

NSNumber *number =[[NSNumber alloc] initWithInteger:0] 

这是为变量

分配内存

然而,这不是:

NSNumber *number = [NSNumber numberWithInteger:1]

现在在我的情况下,我想调查这一行背后发生的事情:

 _storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
  1. 通过在循环中重复(storyboardWithName)方法,我每次都分配不同的内存?如果我的故事板很大,那么这是不好的做法吗?
  2. 如果我在一个方法块中使用此方法(storyboardWithName),最好只在该方法中定义它吗?完成方法块后它会自动释放吗?如果定义为类成员变量怎么办?
  3. 如果我分配了这个对象,当剂量被内存管理(@autoreleasepool)取消分配时?*
  4. 基本上在我的情况下这意味着什么剂量:

      

    对于这种方法说:

         
        
    • storyboardWithName:束:
    •   
         

    创建并返回指定故事板的故事板对象   资源文件。

    .....

      

    返回值指定文件的情节提问对象。如果不   故事板资源文件匹配名称存在,抛出异常   描述:找不到名为' XXXXXX'的故事板在   捆绑....

         

    讨论使用此方法检索故事板对象   包含您要访问的视图控制器图。全部   与故事板关联的资源必须在捆绑中   由storyboardBundleOrNil参数指示。

         

    是保留对象,但由于我们没有分配/复制,所以不会   需要释放变量。

    https://developer.apple.com/library/ios/documentation/UIKit/Reference/UIStoryboard_Class/#//apple_ref/doc/uid/TP40010909-CH1-SW6

    更新

    这是我从这张幻灯片中理解的,我有点迷惑!

    enter image description here

    链接到幻灯片:http://www.slideshare.net/whalec1/ios-memory-management-basis

3 个答案:

答案 0 :(得分:1)

创建大量的故事板对象并不是一个坏习惯,直到你真的需要它们为止。

此外,它可能没有您期望的那么大。当storyboard被实例化时,它只是已经实例化的故事板,在你使用它之前,没有任何场景会被分配内存 - (__kindof UIViewController *)instantiateViewControllerWithIdentifier:(NSString *)identifier;

使用上述方法实例化的ViewController具有属性 @property(nullable, nonatomic, readonly, strong) UIStoryboard *storyboard,存储对故事板的强引用。因此,即使本地故事板对象超出范围,故事板对象也会被控制器强烈引用,并且在ViewControllers发布之前不会释放。

答案 1 :(得分:1)

问题的第一部分是错误的。

你说

NSNumber *number = [NSNumber numberWithInteger:1]

不分配内存。当然可以。

该方法是一种“便利方法”。它是一个在内部分配和初始化对象的类方法。

NSNumber是一个特例。在内部,系统对常用的数值进行一些特殊处理。例如,如果创建多个numberWithInteger:1实例,则会获得指向同一对象的指针,而不是指向具有相同值的多个唯一对象。

对于故事板,故事板是一个包含其他对象,文件管理等的大型复杂对象。当您使用storyboardWithName创建故事板时,系统不会加载故事板中的所有视图控制器。它创建顶级对象,然后根据需要创建视图控制器。

如果你在循环中反复调用storyboardWithName然后是,它每次都会创建一个新对象。不要那样做。您应该在应用程序的生命周期中为每个名称创建一次Storyboard对象,然后在整个过程中使用该单个实例。

答案 2 :(得分:1)

NSNumber *number =[[NSNumber alloc] numberWithInetger],这是不可能的。这是错误的语法。

NSNumber *number = [NSNumber numberWithInteger:1]肯定会分配内存。

_storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];表示_storyboard是您Storyboard的引用,因此,它只是指向故事板分配的故事板或内存。它不会创建另一个故事板副本。