Should you set the delegate to nil in the class using the delegate or in the class itself

前端 未结 3 613
遥遥无期
遥遥无期 2020-12-16 15:44

If class A is using class B and class A is class B\'s delegate, is it ok if the delegate is set to nil in class B\'s dealloc? I have seen code usually resetting the delegate

3条回答
  •  醉梦人生
    2020-12-16 16:22

    First, a few observations...

    1. You've forgotten to call [super dealloc] at the end of your own dealloc method.
    2. Since 'a' created 'b', and if no other objects have retained 'b', there no point in nilling the delegate in the -dealloc, since 'b' is about to be destroyed anyhow. If it's possible that other objects have a reference to 'b' (meaning it might outlive 'a') then set the delegate to nil.
    3. Object 'b' should be the one to take care of its delegate in its own -dealloc if necessary. (Generally, the delegator does not retain the delegate.)
    4. Avoid using properties in -init... and -dealloc methods — Apple discourages this, and for good reason. (Not only could it have unexpected side effects, but can also cause nastier, crashier problems.)
    5. Using properties (via the dot syntax) when you don't need to invisibly adds extra work. For instance, self.b.delegate = self is equivalent to [[self getB] setDelegate:self] — it's just syntactic sugar that makes it look like you're accessing the ivar directly, but you're actually not.
    6. Using properties without understanding what they do can lead to trouble. If self.b retains the value (the property is set to "assign"), you have a memory leak on your hands.

    Here's how I would probably write it:

    - (void) someFunc {
      b = [[B alloc] init];
      b.delegate = self; // or [b setDelegate:self];
    }
    
    - (void) dealloc {
      b.delegate = nil;
      [b release];
      [super dealloc];
    }
    

提交回复
热议问题