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

Objective-C 學習筆記:實例變數可見度、方法分類與聲明、@class 避免循環引用

     編輯:關於C語言

前言

整理 Objective-C 實例變數存取控制、方法類型與聲明語法、初始化方法、導入機制 (`#import`/`@class`)。

一、實例變數可見度

修飾詞可見範圍備註
@public類別內外皆可 (`obj->ivar`)破壞封裝,**不建議使用**
@protected本類別與子類別 (預設)平衡封裝與繼承
@private僅本類別最高封裝
@interface Person : NSObject {
    @public NSString *hobby;
    @protected NSString *name; NSInteger age;  /* 預設 protected */
    @private NSString *sex;
}
@end

二、方法分類與聲明

  • 類方法:`+ (id)alloc` — 僅類別可呼叫,無 `self`,不可存取實例變數。
  • 實例方法:`- (void)sayHi` — 僅實例可呼叫,有 `self`。

方法命名規則

  • 去除 `+/-`、回傳類型、參數類型、參數名、空格 → 方法名。例:`replaceObjectAtIndex:withObject:`
  • 冒號代表參數,不可省略,有冒號必有參數。
  • 同類別不可有同名方法 (含參數部分)。

存取器標準格式

/* 實例變數 _age 或 age */
- (void)setAge:(NSInteger)age;  /* set + 首字母大寫 */
- (NSInteger)age;               /* 同變數名 (忽略底線) */

多參數初始化

- (instancetype)initWithName:(NSString *)name sex:(NSString *)sex {
    self = [super init];
    if (self) { _name = name; _sex = sex; }
    return self;
}

三、訊息傳送機制

Objective-C 採訊息傳送:`[receiver message]`。
非「呼叫方法」,而是「向接收者發送訊息」。接收者查找並執行對應方法 (動態綁定)。

四、#import 與 @class

  • `#import "xxx.h"`:導入自訂類別,自動防重複導入 (類似 `#pragma once`)。
  • `#import `:導入系統框架頭文件。
  • 風險:循環導入 (A 導入 B,B 導入 A)。
  • `@class ClassName;`:前向宣告,告知編譯器此為類別名,**不導入介面內容**,有效打破循環。

循環引用範例 (Teacher ↔ Student)

/* Teacher.h */
@class Student;  /* 前向宣告 */
@interface Teacher : NSObject { Student *_student; } ... @end

/* Student.h */
@class Teacher;
@interface Student : NSObject { Teacher *_myTeacher; } ... @end

/* .m 檔再 #import 完整頭文件 */

五、總結

善用 `@protected`/`@private` 封裝實例變數、標準化存取器命名、理解訊息傳送動態特性、用 `@class` 解決循環導入,是撰寫健壯 Objective-C 程式的基礎。

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