• 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(@"
     title:%@ 
    ",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 我一定会执行反馈的!!!)

  • 相关阅读:
    sql server 中各个系统表的作用==== (转载)
    后台动态设置前台标签内容和属性
    利用C#编写一个简单的抓网页应用程序
    如何创建和使用Web Service代理类
    jdbc如何取得存储过程return返回值
    子窗口和父窗口的函数或对象能否相互访问 (转载)
    把aspx文件编译成DLL文件
    C#中的类型转换
    c#中对文件的操作小结
    转贴一篇 自定义数据库 希望对你有帮助
  • 原文地址:https://www.cnblogs.com/someonelikeyou/p/5780490.html
Copyright © 2020-2023  润新知