Ios 未使用Arc保留功能参数?
编辑:这用于静态NSMutableDictionary,而不是类成员。我看到很多答案都认为是班级成员,对此我很抱歉。谢谢你的快速回复 我有一段工作代码,但使用了2x,因此我编写了一个方便的函数: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.
- (void) initializeDictionary:(NSMutableDictionary*)mutableDict fromPathName:(NSString*)path
{
mutableDict = // get from file, init if not there.
}
然后我注意到没有任何东西可以节省。通过单步执行代码,函数创建一个字典,但返回时“传入”值仍然为零。这完全打消了我对指针的理解(别误会,我很舒服)。但我认为,他们的目的是让你“传递地址”,这样我就可以找到它所指的东西
由于mutableDict是“值拷贝”,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的指针几乎是自动取消引用的,因为[]的语法处理消息传递的内容。嘎,我知道总有一天我会的。谢谢。这是一种很常见的方法。甚至有一个命名约定说,这样的方法应该从