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

Objective-C 學習筆記:屬性 、@synthesize 、屬性特性 、KVC 完整指南

     編輯:關於C語言

前言

Objective-C 2.0 引入屬性語法,自動生成存取器,簡化程式碼。本文系統整理屬性宣告/實現、屬性特性、點語法、KVC 機制。

一、屬性宣告與實現

/* .h 宣告 */
@property NSString *name;

/* 相當於生成 */
- (void)setName:(NSString *)name;
- (NSString *)name;

/* .m 實現 (Xcode 4.5+ 自動 @synthesize) */
@synthesize name = _name;  /* 手動指定實例變數名稱 */

/* 相當於生成 */
- (void)setName:(NSString *)name { _name = name; }
- (NSString *)name { return _name; }

注意:若在 `.m` 重寫存取器,**必須**保留 `@synthesize`,否則編譯器不會生成實例變數 `_name`。

二、屬性特性 (Attributes)

類別關鍵字說明預設
讀寫控制readonly唯讀,僅生成 getterreadwrite
readwrite可讀寫,生成 setter/getter
setter=名, getter=名自訂存取器名稱
原子性atomic多執行緒安全 (鎖),效能較低atomic
nonatomic非原子,**建議預設用此**
記憶體語意assign單純賦值,適用基本類型assign
retain保留新值、釋放舊值,適用物件 (MRC)
copy複製新值,適用 NSString/NSArray 等可變類別

組合範例:`@property (nonatomic, copy) NSString *name;`

三、點語法

符合慣例存取器的方法均可用點語法:

[person setName:@"ZhangSan"];  →  person.name = @"ZhangSan";
NSString *n = [person name];    →  NSString *n = person.name;

本質:編譯器將點語法轉換為對應訊息傳送。

四、KVC (Key-Value Coding)

透過字串鍵間接存取屬性/實例變數。

設值

[obj setValue:value forKey:@"key"];
[obj setValue:value forKeyPath:@"key.subKey"];  /* 鍵路徑 */
[obj setValuesForKeysWithDictionary:dict];      /* 批次 */

取值

[obj valueForKey:@"key"];
[obj valueForKeyPath:@"key.subKey"];

鍵不存在處理

- (void)setValue:(id)value forUndefinedKey:(NSString *)key {
    NSLog(@"Undefined key: %@", key);  /* 預設拋出異常,可覆寫吞掉 */
}
- (id)valueForUndefinedKey:(NSString *)key { return nil; }

五、完整範例 (Person + Classroom)

見原文件碼,展示 `@property` 多種特性組合、KVC 賦值/取值/鍵路徑/異常處理。

總結

屬性 + `@synthesize` + 特性關鍵字 + 點語法 + KVC 構成 Objective-C 物件屬性管理的完整體系。現代開發 (ARC) 下 `retain`/`copy` 語意由編譯器自動處理,重點掌握 `nonatomic`/`copy` (NSString) 等常用組合。

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