iOS 學習如何聲明私有變量和私有方法


私有變量

首先來說 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 我一定會執行反饋的!!!)

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM