iOS Proper Use of @weakify(self) and @strongify(self)

后端 未结 3 898
没有蜡笔的小新
没有蜡笔的小新 2021-01-29 21:17

I\'m starting to integrate libextobjc (https://github.com/jspahrsummers/libextobjc) into my iOS application primarily to take advantage of EXTScope\'s @strongify an

3条回答
  •  庸人自扰
    2021-01-29 21:45

    Calling "self" inside the block that in hold by "self" will lead to "Retain Cycles" and hence memory leaks. So ideally it goes like:

    @interface A: NSObject // Some interface A
    
    @property (nonatomic, copy, readwrite) dispatch_block_t someBlock; // See block is strongly retained here.
    
    @end
    
    *******************************************************
    @implementation A
    
    - (void) someAPI
    {
        __weak A * weakSelf = self; // Assign self to weakSelf and use it
        // enter code here inside block to break retain cycles.
        self.someBlock = 
        ^{
            A * strongSelf = weakSelf; // Assign weak self to strongSelf before
           // using it. This is because weakSelf can go nil anytime and it may happen
           // that only few lines from block get executed before weakSelf goes nil,
           // and hence code may be in some bad state.
            if (strongSelf != nil)
            {
                // Use strongSelf.
                [strongSelf doSomethingAwesome];
                [strongSelf doSomethingAwesomeAgain];
            }
        };
    }
    
    @end
    

    If the block is not retained by "self", then its safe to just use "self" inside blocks and they won't create retain-cycles.

    Note: Memory management concept remains same with use of "libextobjc" library.

提交回复
热议问题