如何使用方法更改指针?
Posted
技术标签:
【中文标题】如何使用方法更改指针?【英文标题】:How do I use a method to change a pointer? 【发布时间】:2011-06-05 20:43:56 【问题描述】:我正在使用目标 C 开发 iPhone 应用程序。我有 A 类,它创建了一个名为“list”的 NSMutableArray 指针。但是,在 A 类中,我从不为其创建指向的对象。相反,我在 B 类中调用一个类方法,从 sqlite 数据库中获取一些数据,并在那里填充一个 NSMutableArray 对象。我希望能够将 A 类中的指针设置为指向在 B 类方法中创建的 NSMutableArray 对象,方法是将其作为参数传递给该方法。我不能通过返回数组来做到这一点,因为我想返回 sqlite 结果。
我想知道我这样做是否正确?我还没有编写完整的方法(完成后会很长),但我想知道在开始其余部分之前我是否正确地完成了指针的工作。
//ClassA.m
//...
NSMutableArray *list;
[ClassB populateArrayFromSqlite:&list];
//Now do stuff with "list", which should point to the array created in populateArrayFromSqlite
//...
//ClassB.m
+(int)populateArrayFromSqlite:(NSMutableArray**)ar
NSMutableArray *array = [[NSMutableArray alloc] init];
//Here there will be code that populates the array using sqlite (once I write it)
//And then I need to set the "list" pointer in ClassA.m to point to this array
ar = &array; //Is this how?
return resultFromSqlite;
我做对了吗?还是我不明白什么?我猜这个指针对指针的东西还没有点击我。在阅读了一些关于指针的一般资料之后,我怀疑这就是我的做法,但我的一部分不明白为什么 ar 参数不能只是一个常规指针(而不是指向指针的指针) .
【问题讨论】:
【参考方案1】:像这样更改指向对象的指针在 Objective-C 中是相当少见的。我们看到这样的事情的主要时间是当一个方法有可能失败时,我们将传递一个指向NSError
引用的指针。比如NSFileManager
的- (BOOL)removeItemAtPath:(NSString *)path error:(NSError **)error
。
更常见的方法是让方法返回数组:
NSMutableArray * list = [ClassB mutableArrayFromSQLite];
【讨论】:
【参考方案2】:指向指针的指针有点特殊,是的。简单的方法是在 A 中创建一个空数组,然后将一个常规数组指针传递给 B 来填充它。如果您坚持在 B 中创建数组,我认为您可以这样做:
- (void) createArray: (NSMutableArray**) newArray
NSAssert(newArray, @"I need a pointer, sweetheart.");
*newArray = [[NSMutableArray alloc] init];
[*newArray addObject:...];
【讨论】:
+1 虽然最好检查if (newArray != nil)
,以免意外取消引用空指针。 :)
对。我提到这种可能性只是为了回答指针对指针的问题,实际上我肯定会使用我首先提到的更简单的解决方案。我将添加一个断言以使事情清楚。
谢谢,我什至没有想到首先在 A 类中创建对象并将指向它的指针传递给 B 类方法。另外,以你的例子,我想我明白这一点。在 newArray 参数中传递指针的地址实际上是向指针发送了一个指针的副本,通过取消引用它,您可以获得指针本身,然后您可以为其分配一个新地址,对吗?
是的,我也是这么理解的。
天哪。不要这样做!以这种方式进入另一个类来设置 ivar 是对封装的严重滥用,并且应该永远在正确编写/架构的 Objective-C 应用程序中完成!以上是关于如何使用方法更改指针?的主要内容,如果未能解决你的问题,请参考以下文章
如何更改指针变量的值并将更改保留在函数之外而无需通过引用传递?