我有一个Objective C函数,它通过引用获取任何类型的对象.但是当我传递一个NSMutableArray我的函数不识别它

Rad*_*adu 0 iphone objective-c

我有一个函数,通过引用实现任何类型的对象 -(BOOL)RemoteCall:(id**)DataClass; 我使用[*DataClass isMemberOfClass:[NSMutableArray class]来找出对象的类型.问题是它不适用于NSMUtableArrays有没有人有这个问题的解决方案?这是相关代码:

执行:

-(BOOL)RemoteCall:(id**)DataClass
{
    if([*DataClass isMemberOfClass:[NSMutableArray class] ] == YES)
    {
            NSMutableArray * SW =(NSMutableArray *)*DataClass;
                       //do something with SW
            DataClass= (id**)SW;
                        return TRUE;
    }
}
Run Code Online (Sandbox Code Playgroud)

任何帮助,我的意思是任何事情都会受到赞赏,我被困住了.

Method Call:
NSMutableArray * channelArray = [[NSMutableArray alloc]init]
Services * serv = [[Services alloc] init];
return [serv RemoteCall:&channelArray]; 
Run Code Online (Sandbox Code Playgroud)

bbu*_*bum 15

在Objective-C中通过引用传递几乎从来都不是正确的方法.

该代码存在许多问题.

  • (id**)指向指向对象的指针的指针.可能根本不是你想要的.

  • YES并且NOBOOL返回类型; 不TRUE

  • 该代码没有理由通过引用返回某些内容.

  • 方法名称以小写字母开头.争论也是如此.

  • NSMutableArray应用程序中永远不会有实例; 只是子类

  • 你不能在一开始就区分出一个可变数组和一个不可变数组; 检查isKindOfClass:isMemberOfClass:对于NSMutableArray不会做你好(这是有用的,但误导).

这个更好:

-(BOOL)remoteCall: (id) dataThing
{
    if([dataThing isKindOfClass:[NSMutableArray class]] == YES)
    {
            NSMutableArray *swArray = dataThing; // not strictly necessary, but good defensive practice
            //do something with swArray
            return YES;
    }
    return NO;
}
Run Code Online (Sandbox Code Playgroud)

被称为:

NSMutableArray * channelArray = [[NSMutableArray alloc]init]; // you'll need to release this somewhere
Services * serv = [[Services alloc] init];
return [serv remoteCall:channelArray]; 
Run Code Online (Sandbox Code Playgroud)

由于您没有返回其他数组remoteCall:,channelArray因此方法将操作内容,并返回YES/NO返回值.

如果有一些原因导致上述似乎不适合您,请解释原因.

注意:代码显然需要一个,NSMutableArray如果你要弄脏内容.该isKindOfClass:可检查NSMutableArray或者NSArray它不会有问题两种方式.在代码中使用数组并需要一个可变数组时,由您来确保数据流是正确的,这样您就不会在需要可变数组的情况下使用不可变数组.

  • 第一线超大而大胆?必须是@bbum的答案!;)(你也想'释放``serv`对象......) (4认同)
  • 当然; 如果你可以区分`NSArray*`和`NSMutableArray*`,那么每个返回`NSArray`的API最终都必须返回用作后备存储的内部`NSMutableArray`的自动释放副本.类似地,你最终得到了很多if-immutable-copy的代码,但是没有办法修复对原始不可变副本的所有引用,因此,对象图维护变成了一个彻头彻尾的噩梦. (2认同)