首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

Objective-C中的"私有方法"或静态函数.我应该使用哪一个?

私有方法:Objective-C中的私有方法是一种特殊的方法,只能在其定义类中调用,不能被子类和外部调用。私有方法可以定义在类内部,也可以定义在类外部,但只能在类内部调用。私有方法可以用于实现类的内部逻辑,同时也可以用于保护类的实现细节,避免被外部直接访问。

静态函数:Objective-C中的静态函数是指函数声明前面有static关键字的方法。静态函数只能在当前类中调用,不能被其他类或外部调用。静态函数可以访问当前类的成员变量和静态变量,但不能访问非静态的变量。静态函数主要用于实现类的内部逻辑,同时也可以用于保护类的实现细节,避免被外部直接访问。

总结来说,私有方法和静态函数都是Objective-C中的一种特殊方法,它们分别用于实现类的内部逻辑和保护类的实现细节。在开发过程中,我们应该根据实际需求选择适当的语法特性来编写代码,以确保代码的安全性和可维护性。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

C Sharp(四)

没有基类声明类隐式直接派生自 object 类。 C# 继承是单继承,与 Objective-C、JavaScript 一样。...在派生类屏蔽基类成员要点如下: 要屏蔽一个数据成员,需要声明一个新相同类型同名成员 要屏蔽一个函数成员,需要在派生类声明带有相同签名函数成员 要然编译器知道我们故意屏蔽基类成员,需要使用 new...有两种形式构造函数初始化语句: 使用 base 并指明使用哪一个基类构造函数 使用 this 并指明使用哪一个当前类构造函数 public MyDerivedClass { public...修饰符修饰 没有方法实现代码块 abstract public void Print(); 抽象成员只能在抽象类声明,一共有 4 类型成员可以声明为抽象: 方法 属性 //必须是静态类 static...,但不能有实例构造函数 扩展方法 如果我们不能修改某个类源文件,而希望给该类添加方法,可以使用扩展方法: //必须是静态类 static class ExtendMyClass { //必须声明为

63020

设计模式(五): 简单而又不失其重要性单例模式(Singleton Pattern)

在之前博客《Objective-C单例模式》中介绍了Objective-CMRC和ARC下单例模式。...有一点需要注意是我们需要将生成单例构造函数(Swift是init()函数)声明成private,这样就避免了外部用户直接使用期构造函数直接生成对象了。...二、使用静态私有常量和静态方法来实现单例 如果你感觉使用dispatch_once来创建单例有些麻烦的话,那么你可以通过静态方法来返回静态私有常量形式来创建单例。...下方就是先创建了一个私有静态常量并分配值,然后在静态方法对其进行返回。只要使用者调用sharedInstance()方法时,就会将staticInstance实例进行返回。...当然使用这种方式来实现单例时同样需要将该类构造方法声明成私有方法,防止外部通过构造器来直接生成实例。同样在代码下方紧跟着是我们测试用例,从测试用例可以看出两个常量内存地址是一致

61050
  • Python学习入门基础 — 第六章 面向对象基础

    设计 在使用面相对象开发前,应该首先分析需求,确定一下,程序需要包含哪些类!...01. dir 内置函数 在 Python 对象几乎是无所不在,我们之前学习 变量、数据、函数 都是对象 在 Python 可以使用以下两个方法验证: 在 标识符 / 数据 后输入一个 ....应用场景及定义方式 应用场景 在实际开发,对象 某些属性方法 可能只希望 在对象内部被使用,而 不希望在外部被访问到 私有属性 就是 对象 不希望公开 属性 私有方法 就是 对象 不希望公开...方法 定义方式 在 定义属性方法时,在 属性名或者方法名前 增加 两个下划线,定义就是 私有 属性方法 ?...,告诉解释器这是一个类方法方法 第一个参数 应该是 cls 由 哪一个类 调用方法方法 cls 就是 哪一个引用 这个参数和 实例方法 第一个参数是 self 类似 提示 使用其他名称也可以

    30020

    iOS&mac OShook框架梳理

    本文梳理了iososx可以用于hook框架及其使用,对于C/C++方法,进行了私有和系统方法区分阐述,本文仅针对hook框架做讨论,对于实验中用到注入、签名等不作阐述。...Objective-C函数hook 原理:MSHookMessageEx对于ObjC函数采用也是method swizzle方法,主要是Objetive-Cruntime机制,可以在ObjC方法时动态采用...;第二个参数message为要HookObjective-C函数message;第三个参数hook为hook后新应该message执行逻辑,即替换后函数地址;第四个参数old为对应该message...(私有系统)hook 原理:MSHookFunction对于C函数是在函数开头修改了汇编指令,使其跳转到新实现,执行完成后再返回执行原指令。...由于是基于runtime,所以C/C++方法是不生效,仅针对Objective-C方法有效,swift不是基于OC对象也不会生效。

    6.1K2516

    译文: 低调奢华有内涵「Runtime」

    当然,是翻译了这篇文章,但是对Runtime理解,还是很基础——主要是还没有太多实践,真实开发几乎也用不到,一如文章所说:「如果可以,避免使用Objective-CRuntime……」。...静态语言,使用静态方法调度,还有前期类型绑定,意味着编译器在「编译时」就已经定下来了。也就是说,当一个程序正在运行时,你可以100%确保开发者意图是会被执行。...用于检视(闭源框架)类方法、属性;进行学习(Looking under the hood & learning from it) 因为Objective-CRuntime允许你检视、重写(覆盖)、修改私有或者闭源框架方法...:(SEL)sel方法动态地添加方法实现)。...说真的,使用Runtime时候,确保知道自己在做什么!风险很高,而且很多事情可能会出错。 不要用来修改苹果框架私有方法,你App上架时会被拒

    97140

    C Sharp(九)

    订阅者注册事件时提供方法称为回调函数或者事件处理程序。...发布者: 发布某个事件结构 订阅者: 注册并在事件发生时得到通知执行事件处理程序结构 事件处理程序: 当事件发生时执行回调函数 事件包含了一个私有委托。...关于事件私有委托: 事件提供了对他私有委托结构化访问,我们无法直接访问私有委托 对于事件,我们只可以添加,删除和调用事件处理程序 事件触发时,会依次调用调用列表方法 声明事件 ---- 发布者类必须提供事件对象...必须声明在类结构 声明事件需要委托类型,我们可以声明一个委托使用已存在。...订阅事件 ---- 订阅者向事件添加处理程序: 使用 += 运算符为事件添加事件处理程序 事件处理程序可以是: 实例方法名称 静态方法名称 匿名方法 Lambda 表达式 cls.CountedADozen

    52120

    干货 | 携程机票 App KMM 跨端生产实践

    接着使用一些顶层函数来桥接 MMKV 静态函数,用扩展函数来桥接 MMKV 在不同平台成员函数,Android 如下: internal actual fun defaultMMKV(): MMKV...3.2 Kotlin/Native 调用非虚函数使用静态分派 JVM 上为了实现多态调用非虚函数机制称为动态分派,即仅在运行时才知道被调用函数到底是哪一个版本(继承类、实现接口会覆盖函数)。...print() 这行代码在编译期就已经确定了到底调用是哪个版本 print 函数,即 Kotlin/Native 调用非虚函数使用静态分派。...代码,而 NSObject 是所有 Objective-C根级超类,看起来所有 Kotlin 类也应该都是 NSObject 子类,但到了 Kotlin 工程,奇怪事情就发生了,Any 类与...每个 Objective-C 对象都能获取自身class 对象,类似于 Java Class 类型 Kotlin KClass<?

    3.5K10

    Objective-C笔记

    带有这种扩展名源代码文件,除了可以包含Objective-C和C代码以外还可以包含C++代码。仅在你Objective-C代码确实需要使用C++类或者特性时候才用这种扩展名。...属性可以被声明为“readonly”,即只读,也可以提供储存方法包括“assign”, “copy”“retain”(简单赋值、复制增加1引用计数)。...虽然Objective-C具备动态类型能力, 但编译期静态类型检查依旧可以应用到变量上。...*) foo; Objective-Cid类型类似于void指针,但是被严格限制只能使用在对象上。...在运行时,分类方法与类原有的方法并无区别,其代码可以访问包括私有类成员变量在内所有成员变量。 若分类声明了与类中原有方法同名函数,则分类方法会被调用。

    93840

    iOS进阶之传递消息

    C语言使用静态绑定”,也就是说,在编译器就能决定运行时所应调用函数。 而如果待调用函数地址无法硬编码在指令之中,就要在运行期读取出来,使用“动态绑定”。...在Objective-C,如果向某对象传递消息,那就会使用动态绑定机制来决定需要调用方法。...这是个“参数个数可变函数,能接受两个两个以上参数。第一个参数代表接收者,第二个参数代表选择子(SEL是选择子类型),后续参数就是消息那些参数,其顺序不变。选择子指就是方法名字。...前面讲这部分内容只描述了部分消息调用过程,其他“边界情况”,则需要交由Objective-C运行环境另一些函数来处理 上面曾提到,objc_msgSend等函数一旦找到应该调用方法实现之后,就会跳转过去...在实际编写Objective-C代码过程,大家无序担心这一问题,不过应该了解其底层工作原理。

    77260

    【IOS】IOS开发问题解决方法索引(三)

    ChromeOS 完全以 WebKit 製作使用者介面,不过我们没办法在 ChomeOS 上写我们在这边所讨论桌面行动应用程序,所以不在我们讨论之列。...://hi.baidu.com/shiqyn/item/52887ff19d3df61aa729885f Objective-C类本身并没有私有方法这个概念,声明在 .h 文件方法都是公有的。...不过,要想实现私有方法效果还是有办法,就是用Category。...)test { // .. } // 方法实现 @end 在上面这个例子,test 就是 Hello 类私有方法”了。...1000次,我们就可以发现两者之间巨大性能差距了,在测试环境,结果如下,c函数耗时仅是第一种方法5%,在此推荐 c语言 一个空文件夹 其中获取大小为68k ,应该是系统文件吧。

    90720

    runtime运行时 isa指针 SEL方法选择器 IMP函数指针

    概述 runtime:Objective-C是动态语言,它将很多静态语言在编译和链接时做事放到了运行时,这个运行时系统就是runtime。...runtime其实就是一个库,它基本上是用C和汇编写一套API,这个库使C语言有了面向对象能力。 静态语言:在编译时候会决定调用哪个函数。...动态语言(OC):在运行时候根据函数名称找到对应函数来调用。 isa:OC,类和类实例在本质上没有区别,都是对象,任何对象都有isa指针,它指向类元类(元类后面会讲解)。...Runtime使用:获取属性列表,获取成员变量列表,获得方法列表,获取协议列表,方法交换(黑魔法),动态添加方法,调用私有方法,为分类添加属性。...主要依据: iOS黑魔法-Method Swizzling ##runtime一些使用 -获取类属性列表 -获取类方法列表 -获取类协议列表 -获取类成员变量列表 -改变私有变量值 -为一个类增加新方法

    31660

    Whats New in LLVM 9

    觉得 LLVM 9 亮点如下: 支持 Objective-C API 可用性检查 新增一些对隐患代码静态分析检查和 warning 更快 LTO,使其可以真正使用 API Availability...() C & C++ 如果是想在 C C++ 查询 API 可用性,可以使用 LLVM 新加 __builtin_available() 函数: if (__builtin_available...首先它会漏检,Check List 之外情况根本检查不出来。如果将一些 API 包含在宏定义或者封装在 C 函数调用,导致语法复杂,静态分析甚至还会误报。...(曾经碰见过几次静态分析检查出 MRC 下一些内存泄露,但其实间接调用了 autorelease ,根本不会泄露,改为直接调用 autorelease 就 OK 了) 程序员自身应该有一份 Check...: Clang 5 Objective-C ARC 方法家族 Objective-C 中有五大方法家族,每个家族都有自己规矩:alloc/new/copy/mutableCopy 四个家族方法返回

    2.4K100

    【java】关于java类和对象,你想知道在这里!

    直接取得它私有实例变量并在方法使用。...对2造成冲突问题,可从两个方向解决:   3.1 为局部变量取另外一个名称   3.2  使用this显式访问实例变量 静态变量和静态方法 当对一个实例变量加以static修饰符时候,它就变成了一个静态变量...,则最终输出应该是1(0+1=1)) 通过静态方法访问静态变量 如果一个方法仅仅用到静态变量的话,那么这个方法应该作为一个静态方法使用而不是实例方法,也就是说, 它要加上static修饰符,例如: public...答案当然是可以,但请注意,如果一个方法仅仅只使用静态变量(例如我们这个例子),那它应该作为一个静态方法,而不是实例方法,原因和上面相同,这容易混淆我们对于静态变量认知 // 虽然能达到相同效果但不要这么做...} } 【注意】上面说法前提“一个方法仅仅只使用静态变量”,如果一个方法不仅仅用到静态变量,情况就不一样了 main方法 想每一个写java筒子们应该都很熟悉一段代码是public static

    1.2K110

    Swift编程小技巧

    1、for in 循环中可选值解包 当使用for in循环一个包含可选值数组时,我们可能会使用if let guard解包: let animals = ["dog", nil, "pig",...也可以实现类似的功能,可以参考:Objective-C实现Swiftdefer 5、布尔值取反 在任何编程语言中,布尔值都是最常用和最简单数据类型之一。...isSelect } 这种写法应该人多一些,也不容易出错一些,但是觉得下面的更好: if isSelect { isSelect.toggle() } toggle()是一个swift提供函数,...idx, BOOL * _Nonnull stop) { NSLog(@"%d -- %@", idx, obj); }]; 8、静态工厂方法 在Swift使用静态工厂方法和属性来执行对象设置可能是一种将设置代码与实际逻辑清晰分开方法...,具体可以参考:Swift:静态工厂方法

    95411

    之三:单例模式

    : popup]; [popup show]; } 假设这个对话框可以保存一些状态,比如上次输入内容之类信息,那我们就需要保证这个实例唯一,也就是第一次使用时候创建一次实例,之后都使用这个实例。...,对于这个自定义对话框,每次调用时候都要去判断需要实例是否存在。...而且例子逻辑判断很简单,真正写时候情况也许会更复杂,这也就意味着每次用它都要写很多重复代码,而这些代码仅仅是为了保证这个类只有一个实例。...但是类都有一个构造方法,即使不写它也会有一个默认构造方法供外部调用,像Java的话,可以直接将构造方法改为私有,不给外部new出实例。...所以关键点就是首先在类创建一个静态全局变量,用来保存当前类实例。然后创建一个获取该实例方法,在该方法中生成实例并保证其唯一即可。

    33210

    Objective-C 入门笔记

    Protocol; 3、它没有命名空间; 4、不支持内联函数; 5、不支持参数默认值; C++太过庞大,所以拿二者比较其实不是特别合适,跟Java相比,觉得可能更适合一些吧 快速入门 1) 类定义...方法分二种:实例方法、类方法,如上图所示,区别类方法和实例方法,主要是它声明符:-、+ + (返回值类型) 类方法名 - (返回值类型) 实例方法名,需要先创建后再使用,比如这样:[[[Hello alloc...] init] methodName]; 无论是哪种方法,调用都是使用括号“[]”,方法准确来讲应该称为发消息,它有三个要素: receiver(消息接收方) selector(选择器,通常指方法名...OC默认所有的方法都是公开,所以如果你想定义一个私有方法,不需要在.h声明方法,直接在.m定义方法就好,但是建议使用p_开头,这样避免与苹果定义一些私有方法名产生冲突。...、NSInteger、NSNumber,定义:NSString *myStr; 更多关于Objective-C学习资料,推荐 Ry’s Objective-C Tutorial

    65830

    python粗谈面向对象(二)

    类属性 类静态字段(静态属性): 公有静态字段:类可以访问,类内部可以访问,派生类可以访问。 私有静态字段:仅类内部可以访问。...静态方法:这是一个特殊方法,它除了在类空间内创建了一个函数外,和类没有任何关系,使用装饰器@staticmethod。...下面是图片应该更清晰些,所以说实例方法就是给实例用,类就不要增加存在感了。如果有特殊情况需要类参与那就使用方法。不要和实例方法混在一起。...: class A: @staticmethod def fun(): print("静态函数") obj = A() obj.fun() A.fun() 关于类静态方法没什么好说...【采用单例模式动机、原因】 对于系统某些类来说,只有一个实例很重要,例如,一个系统可以存在多个打印任务,但是只能有一个正在工作任务;一个系统只能有一个窗口管理器文件系统;一个系统只能有一个计时工具

    62930

    Objective-C Runtime编程指南(1)

    您只需编写和编译Objective-C源代码即可使用它。 编译包含Objective-C类和方法代码时,编译器将创建实现该语言动态特性数据结构和函数调用。...这些函数许多函数允许您使用plain C来复制编译Objective-C代码时编译器功能。 其他形成了通过NSObject类方法导出功能基础。...Objective-C方法只是一个C函数,它至少需要两个参数self和_cmd。 您可以使用函数class_addMethod将函数添加到类。...在很多情况下,NO是正确答案。 但它也可能不是。 如果使用转发来设置代理对象扩展类功能,则转发机制应该与继承一样透明。...如果使用协议,conformsToProtocol:方法同样应该被添加到列表

    80720

    ios 笔试题3

    私有变量呢 objective-c - 类里面的方法只有两种, 静态方法和实例方法. 这似乎就不是完整面向对象了,按照OO原则就是一个对象只暴露有用东西....,其声明函数和变量可以在本模块 其它模块中使用。...如果模块以函数实现,那么头文件要按 c格式声明函数,实现文件,c++函数内部可以用obj-c,但后缀还是mmm。...如果类在概念上只有一个实例(比如NSWorkspace),就应该产生 一个单件实例,而不是多个实例;如果将来某一天可能有多个实例,您可以使用单件实例机制,而不是工厂方法函数。...Objective-C 与 C++ 可混合编程 缺点:  1) 不支援命名空間  2)  不支持运算符重载  3) 不支持多重继承   4) 使用动态运行时类型,所有的方法都是函数调用,所以很多编译时优化方法都用不到

    72910

    Java8 Lambda表达式与Stream API (一):Lambda表达式你要知道Java8 匿名内部类、函数式接口、lambda表达式与Stream API都在这里

    父类构造器() { //需要实现方法重载父类方法 } 匿名内部类语法很简单,必须要实现一个接口或者继承一个类,可以看到使用了new关键词,因此在创建匿名内部类同时会创建一个该类实例,...,因此在创建匿名内部类时候需要显示调用该构造函数,这样就可以在匿名内部类内部使用父类定义成员变量了,匿名内部类也可以使用外部变量,在Java8上述栗子age会自动声明为final类型,这称为effectively...,因此使用lambda表达式系统一定知道我们实现接口哪一个方法,因为实现接口有且只有一个抽象方法供我们实现。...第二个sort方法则直接引用了对象实例方法,语法规则为类::实例方法,系统会自动将函数式接口实现方法所有参数第一个参数作为调用者,接下来参数依次传入引用方法即自动进行s1.compareTo...accept(T t);,因此可以使用lambda表达式进行调用,这里引用System.out方法println,引用语法类::类方法,系统会自动将实现函数式接口方法所有参数都传入该类方法并进行自动调用

    1K80
    领券