刚刚接触Objective-C。我知道在创建新对象时应该使用指针,例如
class *var = ....
现在,我也明白,在调用这个对象时,让我们在一个方法中说,一旦它已经被创建,我们就不必使用指针了,对吗?
在对象创建之外的其他实例中,我们应该使用*标记吗?
答案 0 :(得分:1)
你总是使用指针,因为OOP对象是在堆上和C C对象中分配的(C调用一个对象,所有“在运行时生活”并且有一个包含OOP对象的地址)和分配的存储类是总是使用指针引用。对于OOP对象,这是一个指向对象的指针,通常称为对象引用。
详细说明:
NSString *pointer = [NSString new]; // pointer is a pointer to an object, an object reference
…
[pointer doSomething]; // pointer *is* a pointer, so a pointer *is* used.
您可能想问,何时使用星号*
作为NSString*
中的对象引用?仅在类型定义(包括转换)中,因为在表达式中它将意味着取消引用指针。结果将是一个OOP对象本身(而不是它的参考)。但是你总是使用指针作为OOP对象。
[*pointer doSomething]; *pointer is an object. But you address receiver of messages using a pointer, not an object
答案 1 :(得分:1)
是的,您将*
用于指向对象的指针。但是还有其他不太常见的指针用法:
例如,考虑enumerateWithBlock
NSArray
方法,其中块会将地址传递给您可以更新的某个BOOL
变量。您可以使用*
更新指针指向的内容:
NSArray *array = @[ ... ]; // define the array any way you want
[array enumerateWithBlock:^(id obj, NSUInteger idx, BOOL *stop)) {
// do something with each object in the array
// if you want to stop (i.e. you found what you need), you'd do something like:
if (...) {
*stop = YES;
}
}];
这种模式用于很多枚举方法。
上述模式的变体是典型的Objective-C错误处理模式。例如,您可能希望在成功时返回特定值,但在出错时,也会传回该错误的详细信息:
/* Return NSData. Upon error, return nil, but also provide `NSError` object if we were
* provided a pointer to a NSError pointer.
*/
- (NSData *)someMethodWithParameter:(NSString *)searchTerm error:(NSError * __autoreleasing *)error
{
// do something with searchTerm
// but, if there was a problem, update error (if we were provided error pointer):
if (successful) {
return data;
} else {
if (error) {
*error = [NSError errorWithDomain:kSomeErrorDomain code:kSomeErrorCode userInfo:nil];
}
return nil;
}
}
你可以使用它:
NSError *error;
NSData *data = [self someMethodWithParameter:searchTerm error:&error];
if (!data) {
// handle the error here
}
有关详细信息,请参阅Error Handling Programming Guide: Using and Creating Error Objects。