代码之家  ›  专栏  ›  技术社区  ›  JsW

是否会导致在函数的参数传递的视图上添加子视图的retain循环?

  •  5
  • JsW  · 技术社区  · 6 年前

    例如:

    // CustomViewClass
    
    - (void)showOnView: (UIView*)view {
        [view addSubview: self.customView];
    }
    

    然后在另一个类中调用此方法,如视图控制器的 viewDidLoad

    - (void)viewDidLoad {
        [super viewDidLoad];
        [self.customViewClass showOnView: self.view];
    }
    

    我将视图控制器的视图传递给 CustomViewClass 如上所述。

    我的问题是: 会不会造成某种保留周期?

    这些视图是否通过弱引用的参数传递?
    或者说没关系。

    如果有人能用这两种语言解释一下,我将不胜感激 迅捷 Objtovi-C .

    3 回复  |  直到 6 年前
        1
  •  5
  •   trungduc 邱林和    6 年前

    什么是保留周期?-这是两个对象保持相互引用并被保留的条件,它创建了一个保留周期,因为两个对象都试图保留彼此,使其无法释放。

    在这种情况下, self.customViewClass 参考 self.view 但是 自视图 没有提到 self.customview类 . 它一直提到 self.customview类 self 不是 自视图

    当然了, 它不会导致保持循环

    不相信我?六镑 -你自己检查一下,试着在里面记录一些东西 dealloc 方法。

    你解雇之后 CustomViewController ,如果里面的代码 释放内存 被调用并记录一些东西,这意味着这里没有保留周期。否则,将导致保持循环。

    例如

    - (void)dealloc {
      NSLog(@"BOOM RIGHT ANSWER!!!");
    }
    
        2
  •  1
  •   Dhruv Narayan Singh Vinod Saggam    6 年前

    当两个类的对象相互指向时,就会发生内存泄漏。

     class A{
       var object_b = B()
     }
    
     class B{
       var object_a = A()
     }
    

    现在考虑你的情况: //自定义视图类

    - (void)showOnView: (UIView*)view {
        [view addSubview: self.customView];
    }
    

    “view”对象是局部变量。customviewClass不引用superview“view”。

    现在,当customview添加到superview时:

    - (void)viewDidLoad {
        [super viewDidLoad];
        [self.customViewClass showOnView: self.view];
    }
    

    当customviewclass的showonview函数调用superview时,只需添加子视图customviewclass视图。

    为了查找内存泄漏,总是在views和viewcontroller类中添加deinit函数,这样您就可以确定about类是否被释放。

    deinit {
        print("deinit called " + "Class name")
    }
    
        3
  •  0
  •   Nitish    6 年前

    这不会导致一个保留周期。它是对象的单向引用,父视图在次(自定义)视图中具有其引用。但是父视图中没有该次视图的引用。因此,除非出现这种情况,否则就保留周期而言,您是相当安全的,不需要弱引用父视图。