何时在obj-C中使用指针?

时间:2014-10-27 15:04:56

标签: objective-c pointers

刚刚接触Objective-C。我知道在创建新对象时应该使用指针,例如

class *var = ....

现在,我也明白,在调用这个对象时,让我们在一个方法中说,一旦它已经被创建,我们就不必使用指针了,对吗?

在对象创建之外的其他实例中,我们应该使用*标记吗?

2 个答案:

答案 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)

是的,您将*用于指向对象的指针。但是还有其他不太常见的指针用法:

  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;
        }
    }];
    

    这种模式用于很多枚举方法。

  2. 上述模式的变体是典型的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