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

Objective-C 中實現全域/靜態變數的正確姿勢

     編輯:程式設計綜合問答

前言

許多從 Android 轉戰 iOS 開發的工程師,習慣在 Java 中使用全域變數來跨方法共享資料。但在 Objective-C 中並沒有所謂「全域變數」這個概念,若直接宣告 static 或 extern 往往會導致編譯錯誤或執行時期崩潰。本文將透過一個實際案例,示範如何以單例模式優雅地解決跨方法資料共享問題。

問題場景

在加速度計委派方法中計算新座標 newX、newY,並需在按鈕點擊事件 clicked: 中取用這兩個值進行碰撞檢測:

-(void)accelerometer:(UIAccelerometer *)accelerometer didAccelerate:(UIAcceleration *)acceleration {
    int newX = (int)(Button.center.x + valueX);
    int newY = (int)(Button.center.y + valueY);
}

-(IBAction)clicked:(id)sender {
    // 這裡需要用到 newX、newY
    if (newX == randX || newY == randY) { ... }
}

錯誤嘗試

  • 在 .h 檔宣告 extern int newX; → 連結錯誤
  • 在 .m 檔宣告 static int newX; → 作用域僅限該檔案,無法跨方法存取

正解:單例模式封裝共享資料

建立專用的資料容器類別 GlobalVariables,採用線程安全的單例寫法:

GlobalVariables.h

@interface GlobalVariables : NSObject
@property (assign, nonatomic) int newX;
@property (assign, nonatomic) int newY;
+ (instancetype)sharedInstance;
@end

GlobalVariables.m

@implementation GlobalVariables
+ (instancetype)sharedInstance {
    static GlobalVariables *instance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [[GlobalVariables alloc] init];
    });
    return instance;
}
@end

使用方式

// 寫入
[GlobalVariables sharedInstance].newX = newX;
[GlobalVariables sharedInstance].newY = newY;

// 讀取
int x = [GlobalVariables sharedInstance].newX;
int y = [GlobalVariables sharedInstance].newY;

優勢總結

  • 型別安全:屬性編譯期檢查,避免拼字錯誤
  • 線程安全:dispatch_once 保證單例唯一性
  • 易維護:未來擴充欄位只需修改一個類別
  • 符合 OOP:資料與操作封裝,避免全域命名空間汙染

下次需要跨類別、跨方法共享資料時,請直接建立單例資料模型,切勿嘗試模擬「全域變數」。

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