私有變量
首先來說 OC 中沒有絕對的私有變量,這么說基於兩點原因:
1可修改: 通過KVC 鍵值編碼 來修改私有成員變量的值
2可讀取 : 通過底層runtime 獲取實例變量Ivar 對應私有值
但是private的存在意義也很明確 不希望被當前類 以外的外界得知.
聲明方式
@private : 作用只能是在自己類
@protected :通常 我們都對變量不做特別約束,只是主觀調控其使用 那么就是默認 @protected, 作用范圍是自身類 和 繼承自身的子類
@public: 作用范圍高於@protect 高於@private 在任何地方調用.
私有變量和不希望被外界直接訪問的變量應該寫在.m文件里面. 如果希望被訪問的 @protected 和 @public 應該放在.h文件里面聲明
使用舉栗子:
#import <Foundation/Foundation.h> @interface MethodDetailMusic : NSObject { @public NSString *publicStr; } @property (nonatomic, strong) NSString * img_url; @property (nonatomic, strong) NSString * amount; @property (nonatomic, strong) NSString * time; @property (nonatomic, strong) NSString * title; @property (nonatomic, strong) NSString * url; @property (nonatomic, strong) NSString * method_id; - (void)initPrivateString; @end #import "MethodDetailMusic.h" @interface MethodDetailMusic() { @private NSString *specialPrivateString; } //聲明一個私有方法 - (void)createPrivateFunction; @end @implementation MethodDetailMusic - (void)createPrivateFunction {//TODO:實施一個私有方法 } - (void)initPrivateString { if (!specialPrivateString) { specialPrivateString = @"我是私有變量"; } NSLog(@"%@",specialPrivateString); }
- (void)viewDidLoad { [super viewDidLoad]; [self test1];//調用 } - (void)test1 { MethodDetailMusic *music = [[MethodDetailMusic alloc]init]; music.title = @"haha"; [music initPrivateString];//這里 調用類本身的實例方法有一處日志 NSLog(@"\n title:%@ \n",music.title); //可修改: KVC 鍵值編碼 修改私有變量 [music setValue:@"修改私有變量的值" forKey:@"specialPrivateString"]; [music initPrivateString]; //可讀取 #import <objc/runtime.h> 獲取私有變量 //定義一個實例變量 privateString Ivar privateString = class_getInstanceVariable([music class], "specialPrivateString"); NSString *privateStr = object_getIvar(music, privateString); NSLog(@"打印私有變量===%@",privateStr); music->publicStr = @"我是公有變量"; [self viewControllerPrivateFunc]; }
log 日志:
2016-08-17 14:36:23.860 LearningTheroyDemo[10907:5802354] 我是私有變量
2016-08-17 14:36:23.860 LearningTheroyDemo[10907:5802354] title:haha
2016-08-17 14:36:23.860 LearningTheroyDemo[10907:5802354] 修改私有變量的值
2016-08-17 14:36:23.861 LearningTheroyDemo[10907:5802354] 打印私有變量===修改私有變量的值
私有方法聲明
方法1:就是在.m文件里面聲明的方法 只能在當前頁面調用 (在.h文件中聲明的方法 是可以被外界調用的)
如代碼music 模型中 .m方法里私有方法的聲明和實施
方法2: 建立類別(也有人管這個叫分類), 網上有人 認為 在這里建立 是對應類的私有方法.
但是我並不這么認為,我主要使用類別分散代碼. 一塊 一塊很規矩 可讀性明顯增強,如果在第三個類里面寫聲明 還是可以調用的, 但是如果你就想當私有方法的話 也並沒有太大問題.使用條件 你都清楚了.寫錯就賴你自己沒注意約束條件吧.
(如果覺得我說的有錯誤 求指正,不要放過 我寫出的bug 給我提bug 我一定會執行反饋的!!!)