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

如果NSDictionary是引用类型,那么为什么不将其自身传播到子类?

NSDictionary是Objective-C中的一个类,用于存储键值对的无序集合。它是不可变的,即一旦创建就不能修改其内容。由于NSDictionary是引用类型,它在内存中以指针的形式存在。

虽然NSDictionary是引用类型,但不建议将其自身传播到子类。这是因为NSDictionary是不可变的,子类无法修改其内容。如果将NSDictionary传播到子类,子类将无法添加、删除或修改键值对,这违背了子类的设计初衷。

相反,如果需要在NSDictionary的基础上进行修改,可以使用NSMutableDictionary类。NSMutableDictionary是NSDictionary的可变版本,可以动态地添加、删除和修改键值对。

在云计算领域中,NSDictionary通常用于存储和传递配置信息、请求参数、响应数据等。它的优势在于快速查找和访问键值对,以及提供了丰富的方法来操作和处理数据。

腾讯云提供了云计算相关的产品和服务,其中与NSDictionary类似的是腾讯云的COS(对象存储)服务。COS是一种高可用、高可靠、低成本的云存储服务,可以存储和管理大量的非结构化数据。您可以使用COS存储和访问各种类型的数据,包括文本、图像、音频、视频等。您可以通过腾讯云官网了解更多关于COS的信息:https://cloud.tencent.com/product/cos

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

相关·内容

编码篇-iOS程序中的内存分配 栈区堆区全局区等相关知识

一个问题:为什么我们在定义NSString时使用Copy而不是 Strong strong和retain同义, weak和assign同义, 为什么要采用这种说法, 似乎是ARC出现后为了消除引用计数的观念而采用的做法...至于为什么要用copy, 由于纯NSString是只读的, 所以strong和copy的结果一样,都是引用计数+1,相当于 retain,但是当是mutable string时,strong是单纯的增加对象的引用计数...,而copy操作是执行了一次深拷贝(开出了新的地址,生成了新的对象), NSMutableString是NSString的子类, 因此NSString指针可以持有NSMutableString对象,我们一般不希望因为之前的值变化导致属性值也跟着变化...任何的修改是在副本上作用,没有作用在原来的变量上。 传指针: 压栈的是指针变量的副本。 当你对指针解指针操作时,其值是指向原来的那个变量,所以对原来变量操作。 传引用: 压栈的是引用的副本。...(作用和传指针一样,只是引用少了解指针的草纸) 从编译的角度来阐述方法中传指针、传引用之间的区别: 程序在编译时分别将指针和引用添加到符号表上,符号表上记录的是变量名及变量所对应地址。

1.6K20

iOS理论基础(一)

b.自身已经对它进行一次强引用,没有必要再强引用一次,此时也会使用 weak,自定义 IBOutlet 控件属性一般也使用 weak;当然,也可以使用strong。...a.NSString、NSArray、NSDictionary 等等经常使用copy关键字,是因为他们有对应的可变类型:NSMutableString、NSMutableArray、NSMutableDictionary...如果不写 copy ,该类的调用者有可能会忘记或者根本不知道“编译器会自动对 block 进行了 copy 操作”,他们有可能会在调用之前自行拷贝属性值。这种操作多余而低效。...然而设置方法并不保留新值,而是将其“拷贝” (copy)。...这个类是 NSString 的子类,表示一种可修改其值的字符串,此时若是不拷贝字符串,那么设置完属性之后,字符串的值就可能会在对象不知情的情况下遭人更改。

25420
  • 面试iOS 机会在自己手中

    答: 编译时是NSString的类型;运行时是NSData类型的对象 6. Object C中创建线程的方法是什么?如果在主线程中执行代码,方法是什么?如果想延时执行代码、方法又是什么?...2.自身已经对它进行一次强引用,没有必要再强引用一次,此时也会使用 weak,如自定义 IBOutlet 控件属性一般也使用 weak;当然,也可以使用strong。...用@property声明的 NSString / NSArray / NSDictionary 经常使用 copy 关键字,为什么?如果改用strong关键字,可能造成什么问题?...类扩展不仅可以增加方法,还可以增加实例变量(或者属性),只是该实例变量默认是@private类型的(使用范围只能在自身类,而不是子类或其他地方),类扩展中声明的方法没被实现,编译器会报警,这是因为类扩展是在编译阶段被添加到类中的...在继承中,子类可以使用父类的方法和变量,当子类想对本类或者父类的变量进行初始化,那么需要重写init()方法 。父类也可以访问子类的方法和成员变量 21.

    54851

    Objective-C Copy

    子类必须遵从协议并且实现 copyWithZone: 方法. 除非是直接继承自 NSObject.子类在实现 copyWithZone: 必须先发送消息给 super 。...如果一个对象的类采用了NSCopying协议并且实现了它的copyWithZone:方法,那么这个对象就可以被拷贝。...因此,如果对象A被浅拷贝到对象B,则对象B引用对象A引用的同一个实例变量(或属性)。 深拷贝对象比浅拷贝更受欢迎,尤其是对于值对象。...YES,如果用这种方法,集合里的每个对象都会被发送一个 copyWithZone: 消息,如果集合里的对象已经适配了NSCopying协议,那么这些对象的引用就会被拷贝到新的集合里。...如果这些对象没有适配NSCopying协议,这种拷贝方式就会报runtime错误。然而,copyWithZone: 产生的是一个浅拷贝,这种类型的深拷贝,是指对集合对象的进行深拷贝。

    47820

    KVO 正确使用姿势进阶及底层实现你要知道的KVC、KVO、Delegate、Notification都在这里

    ,不会增加引用,也不会在对象释放后置空,因此需要自己持有监听对象的强引用,该参数也会在回调函数中回传 */ - (void)addObserver:(NSObject *)observer forKeyPath...KVO在注册监听器的时候不会持有监听器对象的引用,也不会像weak那样在监听器对象被销毁时置nil,而是仅仅保留监听器对象的地址,类似于copy修饰符,当监听器对象被销毁而又没有删除监听器时,如果这个时候被监听对象的值发生变化系统会执行监听器的回调函数...context是一个id类型的参数,在注册监听器时可以传入该参数,在回调函数中会回传该参数,因此,该参数就能完美的解决上述两个问题。那context这个id类型的参数设置为什么值比较合适呢?...可能第一感觉还是设置为NSString类型,但这样仍然可能会产生冲突,苹果推荐的做法是创建一个静态变量然后使用该静态变量的地址作为context,通过这样的方法就能够保证context的独一无二。...,其实这里还少了一个栗子,就是不使用context,当我们不使用context仅仅通过keyPath判断,根本无法得知继承的父类是否也在监听同一对象,如果我们继承的是第三方的框架,很可能就会产生未知的异常

    1.6K80

    iOS - 关于 KVO 的一些总结

    C指针),在监听方法中可以接收到这个数据,是KVO中的一种传值方式 如果传的是一个对象,必须在移除观察之前持有它的强引用,否则在监听方法中访问context就可能导致Crash...② 如果都由 person 来处理,那么在 Person 类的监听方法中又该怎么判断是自己的事务还是子类对象的事务呢?   ...context注意点: ① 如果传的是一个对象,必须在移除观察之前持有它的强引用,否则在监听方法中访问context就可能导致Crash; ② 空传NULL而不应该传nil。...3.6 KVO 新旧值相等时不触发   有时候我们可能会有这样的需求,KVO监听的属性值修改前后相等的时候,不触发KVO的监听方法,可以结合KVO的自动触发控制和手动触发来实现。   ...如果注册方法中context传的是一个对象,必须在移除观察之前持有它的强引用,否则在监听方法中访问context就可能导致Crash。

    2.6K21

    《Effective Objective-C》干货三部曲(二):规范篇

    可以避免循环引用:因为如果两个类在自己的头文件中都引入了对方的头文件,那么就会导致其中一个类无法被正确编译。...如果存在nil值,则会立即抛出异常。如果在不用字面量语法定义数组的情况下,如果数组内部存在nil,则系统会将其设为数组最后一个元素并终止。...而且,对于集合类的对象,更应该仔细考虑是否可以将其设为可变的。 如果在公开部分只能设置其为只读属性,那么就在非公开部分存储一个可变型。...第50条:构建缓存时选用NSCache 而非NSDictionary 如果我们缓存使用得当,那么应用程序的响应速度就会提高。...值得注意的一点是,如果子类没有实现它,它的超类却实现了,那么就会运行超类的代码:这个情况往往很容易让人忽视。 看一下?

    91621

    《Effective Objective-C》干货三部曲(二):规范篇

    可以避免循环引用:因为如果两个类在自己的头文件中都引入了对方的头文件,那么就会导致其中一个类无法被正确编译。...如果存在nil值,则会立即抛出异常。如果在不用字面量语法定义数组的情况下,如果数组内部存在nil,则系统会将其设为数组最后一个元素并终止。...而且,对于集合类的对象,更应该仔细考虑是否可以将其设为可变的。 如果在公开部分只能设置其为只读属性,那么就在非公开部分存储一个可变型。...第50条:构建缓存时选用NSCache 而非NSDictionary 如果我们缓存使用得当,那么应用程序的响应速度就会提高。...值得注意的一点是,如果子类没有实现它,它的超类却实现了,那么就会运行超类的代码:这个情况往往很容易让人忽视。 看一下?

    82610

    iOS_Effective Objective-C 20 编写高质量iOS与OS X代码的52个有效方法

    属性的存取方法不遵循这种命名方式~ 应该把表示参数类型的名词放在参数前面 如果方法要在当前对象上执行操作,那么就应该包含动词;若执行操作时还需要参数,则应该在动词后面加上一个或多个名词 不要使用str这种简称...如果按“引用数”回溯,那么最终会发现一个“根对象”(root object)。在iOS应用程序中,则是UIApplication对象,是程序启动时创建的单例。 ​...如果能,那么程序就不崩溃,可你会觉得奇怪:为什么收到消息的对象不是预想的那个呢?若新对象无法响应选择子,则程序依然会崩溃。 ​...块的强大之处是:在声明它的范围里,所有变量都可以为其所捕获。有些变量若需在块内修改,需要加上__block修饰符。 ​ 如果块所捕获的变量是对象类型,那么就会自动保留它。...及当NSPurgeableData对象所占用内存被系统丢弃时,该对象自身也会从缓存中移除 如果缓存使用得当,那么应用程序的响应速度就能提高。

    1.1K40

    面经之《招聘一个靠谱的iOS》import CYLBlockExecutor.himport CYLBlockExecutor.himport CYLNSObject+RunAtDeallo

    在 ARC 中,在有可能出现循环引用的时候,往往要通过让其中一端使用 weak 来解决,比如: delegate 代理属性 自身已经对它进行一次强引用,没有必要再强引用一次,此时也会使用 weak,自定义...这个类是 NSString 的子类,表示一种可修改其值的字符串,此时若是不拷贝字符串,那么设置完属性之后,字符串的值就可能会在对象不知情的情况下遭人更改。...这个类是 NSString 的子类,表示一种可修改其值的字符串,此时若是不拷贝字符串,那么设置完属性之后,字符串的值就可能会在对象不知情的情况下遭人更改。...一般情况下无须修改默认的实例变量名,但是如果你不喜欢以下划线来命名实例变量,那么可以用这个办法将其改为自己想要的名字。...一般情况下无须修改默认的实例变量名,但是如果你不喜欢以下划线来命名实例变量,那么可以用这个办法将其改为自己想要的名字。

    1K100

    《Effective Objective-C 》干货三部曲(三):技巧篇

    为什么要这么做呢笔者认为这么做的原因是为了“弱化”子类的具体类型,让开发者无需关心创建出来的子类具体属于哪个类。(这里觉得还有点什么,但是还没有想到,欢迎补充!)...举个 : - (void)setObject:(id)object forKey:(id)key; 这个方法是NSDictionary的设值方法,它的参数只要遵从了协议,就可以作为参数传进去...多个对象的保留环: 如果保留环连接了多个对象,而这里其中一个对象被外界引用,那么当这个引用被移除后,整个保留环就泄漏了。...第39条:用handler块降低代码分散程度 下载网络数据时,如果使用代理方法,会使得代码分布不紧凑,而且如果有多个下载任务的话,还要在回调的代理中判断当前请求的类型。...返回值只能是void或者对象类型。 但是如果将方法放在块中,通过GCD来操作就能很好地解决这些问题。

    76010

    《Effective Objective-C 》干货三部曲(三):技巧篇

    为什么要这么做呢? 笔者认为这么做的原因是为了“弱化”子类的具体类型,让开发者无需关心创建出来的子类具体属于哪个类。(这里觉得还有点什么,但是还没有想到,欢迎补充!)...举个 : - (void)setObject:(id)object forKey:(id)key; 这个方法是NSDictionary的设值方法,它的参数只要遵从了协议,就可以作为参数传进去...多个对象的保留环: 如果保留环连接了多个对象,而这里其中一个对象被外界引用,那么当这个引用被移除后,整个保留环就泄漏了。 ?...第39条:用handler块降低代码分散程度 下载网络数据时,如果使用代理方法,会使得代码分布不紧凑,而且如果有多个下载任务的话,还要在回调的代理中判断当前请求的类型。...返回值只能是void或者对象类型。 但是如果将方法放在块中,通过GCD来操作就能很好地解决这些问题。

    77620

    Python面试必刷题系列(4)

    Python中的鸭子类型了解吗? 鸭子类型(duck typing),是python面向对象的一种多态机制。...打个比方就是,程序现在需要一个像鸭子一样的对象来执行游泳、走、叫的功能,但是这时候传第过来的是一个鸟,这个鸟具有这些功能,而且执行的效果和鸭子完全一样!!那么,我们就可以认为这个鸟就是一个鸭子类型。...如果函数收到的是一个可变对象(比如dict或者list)的引用,就能修改对象的原始值——相当于传址。如果函数收到的是一个不可变对象(比如数字、字符或者元组)的引用(其实也是对象地址!!!)...所以python的传值和传址是比如根据传入参数的类型来选择的: 传值的参数类型:数字,字符串,元组(immutable) 传址的参数类型:列表,字典(mutable) 你知道哪些魔法函数?用过吗?...异常类 含义 KeyError 试图访问字典里不存在的键 ValueError 传入一个调用者不期望的值,即使值的类型是正确的 TypeError 在运算或函数调用时,使用了不兼容的类型时引发的异常 IndexError

    69520

    iOS 组件化-路由解耦思想 JLRoutes 实战篇(一)App内控制器跳转

    (image-d9aae4-1612352196155)] 来解决 App 内外所有页面之间的跳转逻辑, 经过这几年的学习和使用, 将其记录一边巩固知识, 写出来跟大家一起学习, 加上看到网上分享关于使用组件化...为什么要用路由来实现 VC 跳转 Router 能做的事情很多, 首先我们用它来解决棘手的控制器耦合关系,是一种非常有效的解决方案; 在 App 中控制器跳转普遍分为 3 种, 模态跳转Modal(...处理 Router : 也就是注册好 Router 之后, 调用相应 Router 时, 我们在注册时写得回调方法, 这里是执行控制器跳转和传参的逻辑。...: 传递过来的参数是字典的数据结构, 所以我们先检测实例 VC 是否包含这个属性, [vc respondsToSelector:NSSelectorFromString(key)], 如果 VC 有这个属性则直接使用...KVC 的方式来进行赋值, 为了防止在开发时, 传入的字典 Key 与 VC 属性不匹配导致一些 Bug, 添加一层 NSAssert,这样能在开发过程中更快找到问题!

    1.6K20

    KVO实现原理

    监听的属性路径为keyPath支持点语法的嵌套 监听类型为options支持按位或来监听多个事件类型 监听上下文context主要用于在多个监听器对象监听相同keyPath时进行区分 添加监听器只会保留监听器对象的地址...,不会增加引用,也不会在对象释放后置空,因此需要自己持有监听对象的强引用,该参数也会在回调函数中回传 */ - (void)addObserver:(NSObject *)observer forKeyPath...的类对象变成了NSKVONotifying_Person,但是我们在调用的时候感觉我们的p1的类对象还是Person,所以,我们可以猜测KVO会在运行时动态创建一个新类,将对象的isa指向新创建的类,新类是原类的子类...1、利用RuntimeAPI动态生成一个子类NSKVONotifying_XXX,并且让instance对象的isa指向这个全新的子类NSKVONotifying_XXX 2、当修改对象的属性时,会在子类...,如果不记录旧的值,那就没有改变一说了 3、直接修改成员变量会触发KVO吗 不会触发KVO,因为KVO的本质就是监听对象有没有调用被监听属性对应的setter方法,直接修改成员变量,是在内存中修改的,不走

    1.1K00

    【Java】面向对象的特征之一(下):多态

    向下转型 1.向下转型的理解 向下转型:将父类引用在还原为子类对象 2.向下转型的格式 子类类型 类型名=(子类类型)父类类型名; 3.向下转型的实现方式 先通过向上转型,在进行强制类型转换...如果我在加一个父类的子类猫类。先将狗向上转型为动物,再将其向下转型为猫类,这样是否可以?...重写的时候,可以使用@Override注解来起提示作用,如果你的重写方法是错的,那么编译器会报错;注意这里的@Override是写在子类重写父类的方法上面,而不是父类方法上方。...如果你在子类的访问权限符是protected,而父类却是public,那么将会报错,可以将public改成比protected访问权限低的default。...但结果是0,为什么? 这就考察到了代码块的顺序,我们知道代码块的顺序是先执行父类和子类静态代码块顺序,在父类的实例和构造在子类的实例和构造。

    25310

    KVO详解(一)

    我们在定义中可以看到,context的类型是void *,这是一个C语言中的指针类型,而C语言中的空指针是使用NULL来表示的。nil表示的是OC中的实例对象的空指针。...通过文档说明我们可以得知,context实际上是一个确定更改通知来源的标识,如果将其设置为NULL,那么在响应所观察的变化的时候就需要通过keyPath和keyPath来共同确定变化的来源,如下: -...其实,NSKVONotifying_LVPerson是LVPerson的子类。 那么如何来证明NSKVONotifying_LVPerson是LVPerson的子类呢?...如果一个子类复写了父类中的某个方法,那么在子类和父类的methodlist中都有该方法,只不过在方法查找过程中先在子类的methodlist中找到了该方法,找到之后就不再往上继续查找了而已。...这说明,移除了观察者之后,会再次调整被观测对象的isa的指向,将其指向最初的原类。 现在在考虑一个问题,既然isa又被指回最初的原类了,那么那个中间子类是否会被销毁呢?答案是不会的。

    76531

    iOS 代码规范

    对外公开某个常量: 如果我们需要发送通知,那么就需要在不同的地方拿到通知的“频道”字符串(通知的名称),那么显然这个字符串是不能被轻易更改,而且可以在不同的地方获取。...而且如果它的子类重载了它的setter和getter方法,那么就可能导致该子类调用其他的方法。 7....而且,对于集合类的对象,更应该仔细考虑是否可以将其设为可变的。 如果在公开部分只能设置其为只读属性,那么就在非公开部分存储一个可变型。...可以避免循环引用:因为如果两个类在自己的头文件中都引入了对方的头文件,那么就会导致其中一个类无法被正确编译。...构建缓存时选用NSCache 而非NSDictionary 如果我们缓存使用得当,那么应用程序的响应速度就会提高。

    2.4K20
    领券