让我们说
NSNumber *number =[[NSNumber alloc] numberWithInetger]
编辑上面的行应该是:
NSNumber *number =[[NSNumber alloc] initWithInteger:0]
这是为变量
分配内存然而,这不是:
NSNumber *number = [NSNumber numberWithInteger:1]
现在在我的情况下,我想调查这一行背后发生的事情:
_storyboard = [UIStoryboard storyboardWithName:@"Main" bundle:nil];
storyboardWithName
)方法,我每次都分配不同的内存?如果我的故事板很大,那么这是不好的做法吗? storyboardWithName
),最好只在该方法中定义它吗?完成方法块后它会自动释放吗?如果定义为类成员变量怎么办?@autoreleasepool
)取消分配时?* 基本上在我的情况下这意味着什么剂量:
对于这种方法说:
- storyboardWithName:束:
创建并返回指定故事板的故事板对象 资源文件。
.....
返回值指定文件的情节提问对象。如果不 故事板资源文件匹配名称存在,抛出异常 描述:找不到名为' XXXXXX'的故事板在 捆绑....
讨论使用此方法检索故事板对象 包含您要访问的视图控制器图。全部 与故事板关联的资源必须在捆绑中 由storyboardBundleOrNil参数指示。
是保留对象,但由于我们没有分配/复制,所以不会 需要释放变量。
更新
这是我从这张幻灯片中理解的,我有点迷惑!
链接到幻灯片:http://www.slideshare.net/whalec1/ios-memory-management-basis
答案 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
的引用,因此,它只是指向故事板分配的故事板或内存。它不会创建另一个故事板副本。