4
A
回答
16
Objective-C的对象始终按引用传递(使用指针) - 你不能按值传递它们。
I.e.以下是好的:
- (void)mutateArray:(NSMutableArray*)array {
// alter array ...
}
......并且可以是例如调用这样的:
NSMutableArray *array = ...;
[self mutateArray:array];
还有通过引用传递指针的可能性:被用作out参数
- (void)newArray:(NSMutableArray **)array;
在这种情况下array
- 你传递一个参考的指针收到一个实例:
- (void)newArray:(NSMutableArray **)array {
*array = [[NSMutableArray alloc] init];
}
...可称为像这样:
NSMutableArray *array = nil;
[self newArray:&array];
仅当返回值已被使用并且必须返回其他信息时,才会使用out参数。举例来说,错误信息就像dreamlax提到的那样。
4
除了Georg Fritzche的回答,可能值得注意的是,有些方法期望得到对象指针的地址。例如:
NSError *anError; // points to garbage now
NSStringEncoding enc;
NSString *aString = [NSString stringWithContentsOfFile:@"/some/file.txt"
usedEncoding:&enc
error:&anError];
if (aString == nil)
{
// anError now points to an initialised NSError object.
}
它变得棘手,因为一些记录方法要求你释放以这种方式获得的对象,有的没有(为一个确实需要明确的释放,见NSPropertyListSerialization
的例子)。
+0
任何需要你以这种方式释放返回的指针的方法*应该*具有明确的文档,因为它违反了Cocoa引用计数的内存管理的基本规则。 – JeremyP 2010-05-31 15:24:02
0
正如Georg Fritzsche所说,NSMutableArray通过自动引用,而不是NSArray。最好的选择是太看波纹管代码:
void mutateImmutableArray(NSArray *array);
void mutateMutableArray(NSMutableArray *array);
void mutateImmutableArrayByRef(NSArray **array);
void mutateMutableArrayByRef(NSMutableArray **array);
int main(int argc, const char * argv[]) {
@autoreleasepool {
//Change immutable array in method that expects immutable array
NSArray *immutable = @[@1,@2,@3];
mutateImmutableArray(immutable);
NSLog(@"After 1: %@",immutable); // 1,2,3
//Change mutable array in method that expects immutable array
NSMutableArray *mutable = [@[@1,@2,@3]mutableCopy];
mutateImmutableArray(mutable);
NSLog(@"After 2: %@",mutable); //1,2,3
//Change mutable array in method that expects mutable array
mutable = [@[@1,@2,@3]mutableCopy];
mutateMutableArray(mutable);
NSLog(@"After 3: %@",mutable); //1,2,3, Four
//Change immutable array in method that expects immutable array by reference
immutable = @[@1,@2,@3];
mutateImmutableArrayByRef(&immutable);
NSLog(@"After 4: %@",immutable); //4,5,6
//Change mutable array in method that expects mutable array by reference
mutable = [@[@1,@2,@3]mutableCopy];
mutateMutableArrayByRef(&mutable);
NSLog(@"After 5: %@",mutable); //1,2,3, Four
}
return 0;
}
void mutateImmutableArray(NSArray *array)
{
array = @[@4,@5,@6];
}
void mutateImmutableArrayByRef(NSArray **array)
{
*array = @[@4,@5,@6];
}
void mutateMutableArray(NSMutableArray *array)
{
[array addObject:@"Four"];
}
void mutateMutableArrayByRef(NSMutableArray **array)
{
[*array addObject:@"Four"];
}
相关问题
- 1. C++ - 通过数组传递参考
- 2. 数组和参考传递
- 3. 通过引用ObjectiveC方法的Swift传递数组
- 4. 传递数组通过在C#参考和管理C++
- 5. 通过类参考传递选择器
- 6. 通过参考传递标签
- 7. JNA传递的char *通过参考
- 8. 仅仅通过参考传递?
- 9. C++通过参考程序传递
- 10. 通过函数参考时传递参数
- 11. 了解通过参考动态分配传递参数
- 12. 通过参考传递迷失参数,值
- 13. 如何通过参数包传递参考?
- 14. 如何通过MethodInfo.Invoke传递参数作为参考
- 15. 传递参数onClick到props.function()通过参考
- 16. Matlab矩阵是通过值传递还是传递参考?
- 17. 传递数组参考[Swift 3 Xcode 8]
- 18. 传递数组作为参考C++
- 19. PowerShell传递数组作为参考
- 20. 通过URL传递参数
- 21. 通过url传递参数
- 22. 通过url传递参数
- 23. 通过Ajax传递参数
- 24. 通过server.execute传递参数?
- 25. 传递参数通过powershell.exe
- 26. 参考传递
- 27. 传递参考
- 28. connot通过参数传递参数
- 29. 传递数组通过AJAX
- 30. 如何通过参考在PHP中传递可变参数的参数?
是什么意思(使用上面的代码为例)时,在方法声明中出现以下内容:' - (空)mutateArray:(NSMutableArray的** )阵列;'? – Garry 2010-05-31 08:41:41
@Garry:新增 - 是否清除它? – 2010-05-31 09:25:15