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

Objective-c返回方法返回NSMutableArray而不是声明的NSArray返回类型

在Objective-C中,返回类型是可选的,因此可以在返回方法中返回NSMutableArray而不是声明的NSArray返回类型。然而,这样做可能会导致潜在的问题,因为调用者可能会假设返回的数组是不可变的,从而导致意外的行为。

为了避免这种情况,最佳实践是在返回方法中返回NSArray,并在需要修改数组时将其转换为NSMutableArray。这样做可以确保调用者知道返回的数组是不可变的,并且可以在需要时进行修改。

以下是一个示例:

代码语言:objective-c
复制
- (NSArray *)getArray {
    NSMutableArray *mutableArray = [NSMutableArray arrayWithObjects:@"Object 1", @"Object 2", nil];
    return [mutableArray copy];
}

在这个示例中,我们首先创建了一个NSMutableArray,并在需要返回数组时将其转换为NSArray。这样,调用者将知道返回的数组是不可变的,并且不能直接修改它。如果需要修改数组,可以在返回的NSArray上调用-mutableCopy方法来创建一个NSMutableArray的副本。

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

相关·内容

Bean Validation声明式校验方法参数、返回

Person getOne(@NotNull @Min(1) Integer id, String name) { ... }; 本文就来探讨探讨如何借助Bean Validation 优雅声明实现方法参数...声明式除了有代码优雅、无侵入好处之外,还有一个不可忽视优点是:任何一个人只需要看声明就知道语义,并不需要了解你实现,这样使用起来也更有安全感。...校验方法返回值 相较于方法参数,返回校验可能很多人没听过没用过,或者接触得非常少。其实从原则上来讲,一个方法理应对其输入输出负责:有效输入,明确输出,这种明确就最好是有约束。...小贴士:@Valid注解用于验证级联属性、方法参数或方法返回类型。比如你属性仍旧是个Java Bean,你想深入进入校验它里面的约束,那就在此属性头上标注此注解即可。...,没约束就没有 如果该方法不是接口方法实现,那就很简单了:该咋地就咋地 值得注意是,在和Spring整合使用中还会涉及到一个问题:@Validated注解应该放在接口(方法)上,还是实现类(方法)上

1.1K20

Bean Validation声明式校验方法参数、返回

Person getOne(@NotNull @Min(1) Integer id, String name) { ... }; 本文就来探讨探讨如何借助Bean Validation 优雅声明实现方法参数...声明式除了有代码优雅、无侵入好处之外,还有一个不可忽视优点是:任何一个人只需要看声明就知道语义,并不需要了解你实现,这样使用起来也更有安全感。...校验方法返回值 相较于方法参数,返回校验可能很多人没听过没用过,或者接触得非常少。其实从原则上来讲,一个方法理应对其输入输出负责:有效输入,明确输出,这种明确就最好是有约束。...小贴士:@Valid注解用于验证级联属性、方法参数或方法返回类型。比如你属性仍旧是个Java Bean,你想深入进入校验它里面的约束,那就在此属性头上标注此注解即可。...- 保持和接口方法一毛一样约束条件(极限情况:接口没约束注解,那你也不能有) - 实现类一个都不写约束条件,结果就是接口里有约束就有,没约束就没有 如果该方法不是接口方法实现,那就很简单了:该咋地就咋地

1.1K71

在Java中为什么不同返回类型不算方法重载?

方法签名是由:方法名称 + 参数类型 + 参数个数组成一个唯一值,这个唯一值就是方法签名, JVM(Java 虚拟机)就是通过这个方法签名来决定调用哪个方法。...从方法签名组成规则我们可以看出,方法返回类型不是方法签名组成部分,所以当同一个类中出现了多个方法名和参数相同,但返回类型不同方法时,JVM 就没办法通过方法签名来判断到底要调用哪个方法了,如下图所示...: 那为什么返回类型不能做为方法签名一部分呢?...,所以方法返回类型不能作为方法签名一部分。...方法返回类型不能作为方法重载依据,因为它不是方法签名组成部分。

3.3K10

百度地图---获取当前位置返回是汉字显示不是经纬度

这是当前项目的第二个需求,返回当前位置  这个需求在百度地图里面实现很简单,但是出了一大堆乱起八糟错误,错误等到后面的文章再说,先说要获取当前位置怎么做 原理很简单: 第一个需要是的通过  GPS...返回geocode    第二步就是反geo转码得到地址输出来就可以了 实现时候就三个东西: 1.定位器  百度里面称为  LocationClient 2.返回结果监听器 百度里面是 一个接口类  ...BDLocationListener  我们需要去实现他就可以了 3.结果反编译  因为返回结果是经纬度 百度里面是  GeoCoder   只需要用到这三个东西就可以实现获取当前位置,首先我们看看怎么使用百度提供... 这个好像是百度经纬度类型,还有国测局加密经纬度gcj02  还有bd09 是百度加密墨卡托坐标 option.setScanSpan(1000); mLocClient.setLocOption(...方法 接下来看看,在需要调用定位时候更简单操作呢,那就是把定位操作放在application里面,在自己定义application里面加上下面的代码就可以: 这是变量:     public LocationClient

2.3K40

OC - 属性关键字和所有权修饰符

同时苹果同样还支持没有下划线写法nullable和nonnull,它们区别在与放置位置不同。 注意:此类关键字仅仅提供警告,并不会报编译错误。只能用于声明对象类型,不能声明基本数据类型。...使用规范: 对于属性、方法返回值、方法参数修饰,使用:nonnull/nullable; 对于 C 函数参数、Block 参数、Block 返回修饰,使用:_Nonnull/_Nullable...1.weak可以修饰对象,assign既可以修饰对象也可以修饰基本数据类型; 2.assign修饰对象在被释放后,指针仍然指向原对象地址;weak修饰对象在被释放之后会自动置指针为 nil; 3...(深浅拷贝) @property (copy) NSMutableArray *array; 答:不论赋值过来NSMutableArray还是NSArray对象,进行copy操作后都是NSArray...由于属性被声明NSMutableArray类型,就不避免会有调用方去调用它添加对象、移除对象等一些方法,此时由于copy结果是NSArray不可变对象,对NSArray对象调用添加对象、移除对象等方法

1.3K31

窥探Swift之数组与字典

在ObjC中可以使用NSArray声明不可变数组,使用NSMutableArray声明可变数组。...NSMutableArray *mutableArray = [NSMutableArray array]; 而在Swift语言中,你可以使用关键字let来声明不可变数组,使用var来声明可变数组,下方代码声明是...有一点需要注意是ObjC中数组只允许往里面存储对象,不允许往里存储基本数据类型(Int, Float等)。而在Swift中是允许把基本数据类型存入数组中,如下方代码段所示。...其实Swift中数组移除方法名和用法和Objective-C中移除可变数组中元素方式极为相似。下方截图中是经常使用移除方法,用法都没有什么难理解地方,在此就简单聊上一嘴。...从Playground中我们容易看出字典中数据是没有固定数据,因为读取字典中值是通过key-value形式不是通过下标的方式。

1.8K90

一文读懂《Effective Java》第43条:返回零长度数组或集合,不是null

对于一个返回null 不是零长度数组或者集合方法,客户端几乎每次用到该方法都可能会忘记写专门处理null 返回代码,进而导致NPE。...在返回值这种级别上担心性能问题是不明智,除非分析表明这个方法是造成性能问题真正源头 对于不返回任何元素调用,每次返回同一个零长度数组是有可能,因为零长度数组不可变不可变对象可能被自由共享...编写数组与集合返回推荐做法 返回空数组,可以使用集合实现类toArray()方法,例如:ArrayList.toArray(): private final List cheeseList...Collections.emptyList(); } else { return new ArrayList(cheeseList); } } 总结 简而言之,返回类型为数组或集合方法...Java 返回值为null 做法,很可能是从C 语言沿袭过来,在C 中,数组长度是与实际数组分开返回,如果返回数组长度为0,再分配一个数组就没有任何好处了。

1.6K20

Objective-C属性(property)特性(attribute)

它帮我们自动生成getter和setter(声明方法,并实现方法。当然,这部分代码并不会出现在你项目中,是隐藏起来)。...注意,基本数据类型(非对象类型,如int, float, BOOL),默认值并不是strong,strong只能用于对象类型。 weak ARC新增特性。...所有有mutable(可变)版本属性类型,如NSString, NSArray, NSDictionary等等——他们都有可变版本类型:NSMutableString, NSMutableArray...'NSString *' 如果用copy修饰NSMutableArray,则在调用addObject:时直接crash: reason: '-[__NSArray0 addObject:]: unrecognized...如果设置为null_resettable,则要重写setter或getter其中之一,自己做判断,确保真正返回不是nil。

1.8K30

Objective—C语言新魅力——Nullability、泛型集合与类型延拓

在OC中,以前是没有这样功能,因此我们在开发中会经常遇到因为某个函数应该返回实例返回了空导致崩溃。...:set方法可以为nil,get方法不可返回nil 一点提示: 你可以发现,iOS9SDK中已经完全兼容使用了这些特性,并且nonnull使用会比nullable广泛多,因此,系统提供了这样一对宏... alloc]init]; 声明了这样一个数组后,就好比我告诉了编译器,这个数组中数据类型都是NSString*类型,现在非常好,如果我这个数组中元素方法,会出现如下提示: ?...它既不是一个类型,也不是关键字,然而却大量存在,如下是系统NSMutableArray头文件: @interface NSMutableArray : NSArray<ObjectType...控件时,viewWithTag方法通常会返回给我们一个UIView类型指针,这就需要开发者手动强转一下,十分麻烦。

97130

重载(overload) 和重写(override) 区别?重载方法能否根据返回类型进行区分?

重载对返回类型没有特殊要求。 方法重载规则: 1.方法名一致,参数列表中参数顺序,类型,个数不同。 2.重载与方法返回值无关,存在于父类和子类,同类中。...3.可以抛出不同异常,可以有不同修饰符。 方法重写规则: 1.参数列表必须完全与被重写方法一致,返回类型必须完全与被重写方法返回类型一致。...2.构造方法不能被重写,声明为final方法不能被重写,声明为static方法不能被重写,但是能够被再次 声明。 3.访问权限不能比父类中被重写方法访问权限更低。...但是,重写方法不能抛出新强制性异常,或者比被重写方法声明更广泛强制性异常,反之则可以。 为什么函数不能根据返回类型来区分重载? 因为调用时不能指定类型信息,编译器不知道你要调用哪个函数。...然而,我们也可能调用一个方法,同时忽略返回值;我们通常把这称为”为它副作用去调用一个方法”,因为我们关心不是返回值,而是方法调用其他效果。

99330

iOS - 关于 KVC 一些总结

示例 如下是 BankAccount 类和 Transaction 类声明。BankAccount 中有一个 transactions 数组属性,其元素为 Transaction 类型。...注意: 因为Swift中所有属性都是对象,所以这里仅适用于Objective-C属性。 当进行赋值如setValue:forKey:时,如果key数据类型是非对象类型,则value就禁止传nil。...- 当KVC调用方与代理对象一起工作时,允许底层属性行为如同NSArray一样,即使它不是NSArray。...如果取到值是一个NSNumber支持数据类型,则将其存储在NSNumber实例并返回。   如果取到不是一个NSNumber支持数据类型,则转换为NSValue对象, 然后返回。...注意: 此步骤中描述机制比上一步效率低得多,因为它可能重复创建新集合对象,不是修改现有的集合对象。因此,在设计自己键值编码兼容对象时,通常应该避免使用它。

1.8K10

iOS开发之__NSArray0、__NSArrayI、__NSArrayM和__NSPlaceholderArray

NSArray类簇 在《effective objective-c 2.0编写高质量iOS与OS X代码52个有效方法》中这样写道:系统框架中有许多类簇,大部分collection类都是类族。...不可变类定义了对所有数组都通用方法可变类则定义了那些只适用于可变数组方法。...在使用NSArrayalloc方法来获取实例时候,该方法会首先分配一个属于某类实例,此实例充当“占位数组”(placeholder array)。...[mybeAnArray class]所返回类绝不可能是NSArray类本身,因为由NSArray初始化方法返回那个实例其类型是隐藏在类族公共接口(publlic facade)后面的某个内部类型...所以总结一下就是:__NSArrayI是NSArray真正类型 ,__NSArrayM是NSMutableArray真正类型

2.8K80
领券