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

Objective-C 點語法屬性屬性完整解析:原子性、讀寫權限、記憶體管理語意

     編輯:關於C語言

屬性宣告語法


@property (attributes) Type name;

屬性屬性分三大類,各自互斥:

1. 記憶體管理語意 (互斥,預設 assign)

屬性行為Setter 實現邏輯適用場景
assign直接指標賦值_ivar = newValue;基本資料型別 (int, float)、非物件指標、Delegate (避免循環保留)
retain保留新值、釋放舊值if (_ivar != newValue) { [_ivar release]; _ivar = [newValue retain]; }物件指標 (ARC 下對應 strong)
copy複製新值、釋放舊值if (_ivar != newValue) { [_ivar release]; _ivar = [newValue copy]; }不可變物件對應可變類別 (NSString/NSArray/NSDictionary)、Block

2. 讀寫權限 (互斥,預設 readwrite)

屬性產生方法用途
readwritegetter + setter可讀可寫
readonly僅 getter不可變屬性、計算屬性

readonly 仍可在類別內部透過直接存取 _ivar 或私有分類重寫 setter 修改。

3. 原子性 (互斥,預設 atomic)

屬性執行緒安全Setter/Getters 實現效能
atomic是 (單一存取)@synchronized(self) { ... }較慢 (鎖開銷)
nonatomic否直接存取快 (預設 iOS 開發推薦)

注意:atomic 僅保證單一屬性存取原子性,不保證 多屬性邏輯一致性或物件圖完整性。

綜合範例


@interface Person : NSObject
@property (nonatomic, copy) NSString *name;      // 複製、非原子、可讀寫
@property (nonatomic, assign) NSInteger age;     // 基本型別
@property (nonatomic, weak) id delegate;         // 弱引用 (ARC)
@property (readonly) NSString *description;     // 唯讀、原子 (預設)
@end

@implementation Person
@synthesize name = _name;
@synthesize age = _age;
@synthesize delegate = _delegate;

// 自訂 setter 示例 (非 ARC 手動管理)
- (void)setName:(NSString *)name {
    if (_name != name) {
        [_name release];
        _name = [name copy]; // copy 語意
    }
}
@end

ARC 環境對應關係

非 ARCARC說明
retainstrong強引用,增加保留計數
assignweak / unsafe_unretainedweak 自動置 nil,unsafe_unretained 不置 nil (可能野指標)
copycopy同樣複製語意

常見陷阱

  1. mutable 物件用 copy:@property (copy) NSMutableArray *arr; setter 會呼叫 copy 產生 不可變 NSArray,後續呼叫 addObject: 會崩潰。解決:內部手動 mutableCopy 或宣告為 strong 並文檔說明不可外部修改。
  2. delegate 循環保留:必須用 weak (ARC) 或 assign (非 ARC)。
  3. atomic 效能誤區:頻繁存取的屬性 (如遊戲座標) 必須 nonatomic。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved