首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

iOS Block 捕獲 self 失敗:在 @interface 宣告 Block 屬性,在方法中初始化

     編輯:程式設計綜合問答

在類別層級直接定義 Block 並引用 self 會導致「use of undeclared identifier self」編譯錯誤。需在 @interface 宣告屬性,在實例方法中賦值。

正確寫法

// .h
@interface MyClass : NSObject
@property (nonatomic, copy) void (^myBlock)(void);
@end

// .m
@implementation MyClass
- (void)setupBlock {
    self.myBlock = ^{
        [self doSomething]; // 此處可正常捕獲 self
    };
}
- (void)doSomething { /* ... */ }
@end

關鍵點

  • Block 屬性設為 copy,確保從堆區複製,避免棧區銷毀。
  • 在方法內賦值時,self 已存在且可被捕獲。
  • 若 Block 內需修改 __block 變數,加上關鍵字。
  • 注意循環引用:若 Block 持有 self 且 self 持有 Block,需用 __weak typeof(self) weakSelf = self; 在 Block 內使用 weakSelf。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved