美文网首页
Objective-C声明类属性

Objective-C声明类属性

作者: 今天写明天改 | 来源:发表于2022-03-19 10:57 被阅读0次

背景

项目里现在经常见到Objective-C的代码,swift代码写多了,类变量直接就是一个属性搞定,例如:

class ClassA: NSObject {
    static var proA = ""
}

某天到了OC代码需要写一个类变量,发现自己回想不起来如何定义一个类属性,今天来看看OC的类属性。

属性定义的方式

首先,声明一个实例属性的方式大家应该都知道:

@property(nonatomic, copy) NSMutableDictionary *DictionaryA;

那么问题就来了,属性修饰符(nonatomic 等)里边并没有类变量的选项。 类型定义的方式前加class变成
class NSMutableDictionary *DictionaryA 编译器直接报错。说明这种方式不行。
除此之外大家平时应该在某些.m文件中见过这样的定义方式:

NSInteger const classInteger = 0;
@implementation ClassA
@end

这实际是定义了一个静态变量。静态变量的作用域就是这个.m文件范围内。这也就意味着我们可以在这个.m文件的任何位置访问这个变量。这是不是很像我们swift里的类变量了。

方案

有了前边的讨论,我们可以知道Objective-C可以在实现文件中定义静态变量,以此来实现类变量的效果。有了这个结果我们就可以解决本类内部需要类变量的需求了。自然有人问了,那么子类呢? 前述静态变量的作用域只在本文件有效,也就意味着只有本类的类方法和实例方法可以访问这个变量,子类访问不到。我们来看下面的方法

类方法定义

大家都知道类方法的定义吧,例如:

+ (instancetype) shardInstance;

这样的方法会返回一个类的实例。Objective-C中子类是可以继承父类的属性和方法的,而我们的类方法又可以访问我们的类变量,所以有了下面的解决方案

解决方法

我们可以在本类的声明中声明一些类方法充当静态变量的getter和setter方法。然后子类来使用这些方法。
当然这会造成其他的类也能访问我们的类变量。实际上Objective-C中类变量因为是静态变量,设计的初衷就是只在类的内部使用,所以我们在提供方法的时候需要认真考虑这一点。

结论

Objective-C里声明类属性可以通过声明类方法和定义静态变量来实现。但是写代码的时候,就要考虑下是不是应该让外部访问我们的类变量。毕竟,'敲那什么的'(援引自某天听到的对这行的描述)和 一个好的工程师,差距就在这里了。

相关文章

  • 2-1 Objective-C语法汇总预览

    课程来自慕课网DavidChin老师 Objective-C语法汇总预览 类的定义 类的属性声明 类的方法声明 类...

  • 翻译:Objective-C运行时编程指南(七)——声明属性(D

    当编译器遇到属性声明时(参见The Objective-C 编程语言中的声明属性),它生成与封闭类、分类或协议相关...

  • iOS----属性

    声明属性 Objective-C声明的属性特性提供了一种简单的方法来声明和实现对象的访问器方法。 概述 ...

  • Objective-C属性

    Objective-C属性修饰符 Objective-C 2.0引入了新的语法以声明变量为属性,并包含一可选定义以...

  • 总结

    类和对象 1.类的声明 class 类名: 类的内容 2.属性 - 声明在类中的变量 a.对象属性 -...

  • day16、类和对象的应用 2019-01-14

    一、复习 1.类的声明 class 类名:类的雷类容 2.类的属性 属性就是声明在类中的变量 a.对象属性:值会因...

  • Objective-C语法

    类的声明 类的实现 类的属性声明 减号方法(普通方法又称对象方法)声明 加号方法(类方法)声明

  • Day16-Python-类和对象-2019/01/14

    recode 1.类的声明 class 类名:类的内容 2.属性---声明在类中的变量 a.对象属性 - 值会因为...

  • Objective-C声明类属性

    背景 项目里现在经常见到Objective-C的代码,swift代码写多了,类变量直接就是一个属性搞定,例如: 某...

  • Day16面向对象2

    类和对象 1.类的声明 class 类名:类的内容 2.属性 - 声明在类中的变量 a.对象属性 - 值会因为对象...

网友评论

      本文标题:Objective-C声明类属性

      本文链接:https://www.haomeiwen.com/subject/rbuodrtx.html