首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Objective-C 基礎筆記(二):@property 與 @synthesize 實現屬性自動合成

     編輯:關於C語言

Objective-C 屬性聲明與自動合成演進

@property 和 @synthesize 是 Objective-C 封裝實例變量、自動生成存取方法的核心機制。Xcode 4.5+ (LLVM 4.0+) 引入**自動合成**,大幅簡化代碼。

手動合成時代 (Xcode < 4.5)

// Person.h
@interface Person : NSObject {
    int _age;           // 實例變量 (默認 @protected)
    int _no;            // 編譯器自動生成同名 ivar
}
@property int age;
@property int no;      // 未顯式聲明 ivar,編譯器生成私有 _no
- (id)initWithAge:(int)age andNo:(int)no;
@end

// Person.m
@implementation Person
@synthesize age = _age; // 手動綁定 property 到 ivar
@synthesize no = _no;   // 省略則綁定同名 ivar (age->age, no->_no)

- (id)initWithAge:(int)age andNo:(int)no {
    if (self = [super init]) {
        _age = age; // 直接訪問 ivar
        _no = no;
    }
    return self;
}
- (NSString*)description {
    return [NSString stringWithFormat:@"age=%d, no=%d", _age, _no];
}
@end

自動合成時代 (Xcode ≥ 4.5 / 現代)

編譯器**自動**執行:

  1. 生成實例變量:_propertyName (下劃線前綴)。
  2. 生成 @synthesize propertyName = _propertyName;。
  3. 生成標準 getter/setter (非 atomic 時無鎖)。
// Person.h (極簡)
@interface Person : NSObject
@property int age;
@property int no;
@end

// Person.m (極簡)
@implementation Person
// @synthesize 可省略!編譯器自動完成
@end

// main.m
int main() {
    @autoreleasepool {
        Person *p = [Person new]; // new = alloc + init
        p.age = 20;               // 調用 setter
        p.no = 3;
        NSLog(@"%@", p);          // 調用 description
    }
    return 0;
}

關鍵規則與陷阱

場景行為注意
顯式聲明 ivar使用該 ivar 存儲ivar 名建議加 _ 前綴區分
未聲明 ivar自動生成 _propertyName私有 (非 @protected),子類不可直接訪問
自定義 getter/setter編譯器**不再**自動合成該屬性需自行實現存取邏輯及 ivar 管理
readonly 屬性只生成 getter@property (readonly) int age;
@dynamic告訴編譯器:運行時動態提供存取方法Core Data / 代理轉發常用

屬性屬性修飾符速查

@property (nonatomic, strong) NSString *name;   // ARC 環境默認 strong
@property (nonatomic, copy) NSString *title;     // 字符串/集合常用 copy 防止外部修改
@property (nonatomic, assign) int age;           // 基本類型、非對象指針
@property (nonatomic, weak) id delegate;         // 避免循環引用
@property (nonatomic, getter=isEnabled) BOOL enabled; // 自定義 getter 名

新舊代碼混用建議

  • 現有手動 @synthesize 代碼**可繼續使用**,與自動合成兼容。
  • 新代碼**直接省略 @synthesize**,享受零樣板碼優勢。
  • 若需自定義存取邏輯 (如懶加載、鑰匙值觀察 KVO 觸發),**僅重寫該屬性的 getter/setter**,編譯器會智能跳過自動合成。

自動合成是 Objective-C 現代化的重要一步,讓開發者專注於業務邏輯而非樣板代碼。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved