Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/100.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 未使用Arc保留功能参数?_Ios_Automatic Ref Counting - Fatal编程技术网

Ios 未使用Arc保留功能参数?

Ios 未使用Arc保留功能参数?,ios,automatic-ref-counting,Ios,Automatic Ref Counting,编辑:这用于静态NSMutableDictionary,而不是类成员。我看到很多答案都认为是班级成员,对此我很抱歉。谢谢你的快速回复 我有一段工作代码,但使用了2x,因此我编写了一个方便的函数: - (void) initializeDictionary:(NSMutableDictionary*)mutableDict fromPathName:(NSString*)path { mutableDict = // get from file, init if not there.

编辑:这用于静态NSMutableDictionary,而不是类成员。我看到很多答案都认为是班级成员,对此我很抱歉。谢谢你的快速回复

我有一段工作代码,但使用了2x,因此我编写了一个方便的函数:

- (void) initializeDictionary:(NSMutableDictionary*)mutableDict fromPathName:(NSString*)path
{ 
     mutableDict = // get from file, init if not there.
}
然后我注意到没有任何东西可以节省。通过单步执行代码,函数创建一个字典,但返回时“传入”值仍然为零。这完全打消了我对指针的理解(别误会,我很舒服)。但我认为,他们的目的是让你“传递地址”,这样我就可以找到它所指的东西

由于mutableDict是“值拷贝”,ARC似乎正在将其清除。我在这里问是因为

  • 其他问题则有相反的问题“为什么要保留这个?”
  • 这似乎不对。在任何指针语言中,您的第一个教程都是“这样您就可以处理原始值”。Arc真的这样做吗?有没有一个概念我不明白
  • 当然,我可能忽略了一些简单的事情

    我似乎通过在别处找到的写回技巧解决了这个问题:

    - (void) initializeDictionary:(NSMutableDictionary* __strong *)mutableDictionary fromPath:(NSString*)path;
    

    并使用&to-call和*deref更改值。它看起来不那么优雅。

    你传递了一个
    NSDictionary
    指针。如果更改
    mutableDict
    (通过分配或赋值)的指针值,这不会反映在作为此函数参数传递的变量上,并且由于mutableDict是在函数中本地定义的,因此将由
    ARC
    自动释放。(不要忘记,即使对于指针,地址在传递给函数时也会被复制)


    第二个解决方案之所以有效,是因为您将一个指针传递给一个指针(不确定那里是否需要strong)。
    *mutableDict
    的值将反映在外部,因为您更新了
    mutableDict
    指向的地址中的值。此值是您分配的字典的地址,由于您通过指针对其进行更改,因此它将反映在函数外部。

    您传递的指针为
    NSDictionary
    。如果更改
    mutableDict
    (通过分配或赋值)的指针值,这不会反映在作为此函数参数传递的变量上,并且由于mutableDict是在函数中本地定义的,因此将由
    ARC
    自动释放。(不要忘记,即使对于指针,地址在传递给函数时也会被复制)


    第二个解决方案之所以有效,是因为您将一个指针传递给一个指针(不确定那里是否需要strong)。
    *mutableDict
    的值将反映在外部,因为您更新了
    mutableDict
    指向的地址中的值。此值是已分配字典的地址,由于您通过指针对其进行更改,因此它将反映在函数外部。

    在Objective-C中,如果在方法中定义变量,则该变量仅在该方法中可见

    如果需要保存变量以便在外部使用,则需要从函数中“返回”变量。您所做的不是一个技巧,而是返回变量的另一种方式

    尝试:

    - (void)initializeDictionaryFromPath:(NSString*)path {
        NSMutableDictionary *mutableDict = // your initialization 
        return mutableDict;
    }
    
    然后,您可以使用以下代码定义词典:

    NSMutableDictionary *mutableDict = [self initializeDictionaryFromPath:path];
    

    在Objective-C中,如果在方法中定义变量,则该变量仅在该方法中可见

    如果需要保存变量以便在外部使用,则需要从函数中“返回”变量。您所做的不是一个技巧,而是返回变量的另一种方式

    尝试:

    - (void)initializeDictionaryFromPath:(NSString*)path {
        NSMutableDictionary *mutableDict = // your initialization 
        return mutableDict;
    }
    
    然后,您可以使用以下代码定义词典:

    NSMutableDictionary *mutableDict = [self initializeDictionaryFromPath:path];
    

    要做您想做的事情,您可以使用多个间接寻址

    - (void) initializeDictionary:(NSMutableDictionary**)mutableDict fromPathName:(NSString*)path
    { 
         mutableDict = // get from file, init if not there.
    }
    
    请注意,参数是(NSMutableDictionary**),一个指向NSMutableDictionary的指针

    要调用该方法,需要创建一个指针并按如下方式传入:

    NSMutableDictionary *mutableDictionary;
    [self initializeDictionary: &mutableDictionary fromPathName:...];
    
    返回时,
    mutableDictionary
    变量将由该方法初始化


    但是,只从方法返回字典可能比这样做更容易。

    要执行所需操作,请使用多个间接寻址

    - (void) initializeDictionary:(NSMutableDictionary**)mutableDict fromPathName:(NSString*)path
    { 
         mutableDict = // get from file, init if not there.
    }
    
    请注意,参数是(NSMutableDictionary**),一个指向NSMutableDictionary的指针

    要调用该方法,需要创建一个指针并按如下方式传入:

    NSMutableDictionary *mutableDictionary;
    [self initializeDictionary: &mutableDictionary fromPathName:...];
    
    返回时,
    mutableDictionary
    变量将由该方法初始化


    但是,从方法返回字典可能比这样做更容易。

    我的上一个代码片段显示了我是如何做的。。。我的问题是,这是否是唯一的办法,因为它使基本操作变得复杂。我们不遵守一种语言,我们遵守的是ARC而不是理解。啊,我刚刚记得,Objective C的指针几乎是自动取消引用的,因为[]的语法处理消息传递的内容。嘎,我知道总有一天我会的。谢谢。这是一种很常见的方法。甚至还有一种命名约定,规定此类方法应以
    get
    开始,请查看
    UIColor
    中的方法,这些方法通过引用来初始化
    r
    g
    b
    值。这里过于复杂了,因为最好(IMHO)只写一个方法,从该方法返回一个初始化值。是的,我以后可能会用这种方式重写东西。谢谢:DMy的最后一个代码片段显示了我是如何做的。。。我的问题是,这是否是唯一的办法,因为它使基本操作变得复杂。我们不遵守一种语言,我们遵守的是ARC而不是理解。啊,我刚刚记得,Objective C的指针几乎是自动取消引用的,因为[]的语法处理消息传递的内容。嘎,我知道总有一天我会的。谢谢。这是一种很常见的方法。甚至有一个命名约定说,这样的方法应该从