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 我一定会执行反馈的!!!)

 

posted on   ACM_Someone like you  阅读(5092)  评论(0编辑  收藏  举报

编辑推荐:
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
· .NET Core 托管堆内存泄露/CPU异常的常见思路
· PostgreSQL 和 SQL Server 在统计信息维护中的关键差异
阅读排行:
· CSnakes vs Python.NET:高效嵌入与灵活互通的跨语言方案对比
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· Plotly.NET 一个为 .NET 打造的强大开源交互式图表库
· 上周热点回顾(2.17-2.23)

导航

< 2025年2月 >
26 27 28 29 30 31 1
2 3 4 5 6 7 8
9 10 11 12 13 14 15
16 17 18 19 20 21 22
23 24 25 26 27 28 1
2 3 4 5 6 7 8
点击右上角即可分享
微信分享提示