在Objective-C中,self是否用于返回对类的引用?

在Objective-C中,self是否用于返回对类的引用?,objective-c,Objective C,我正在阅读一本关于可可和Objective-C的书。有一个例子让我感到困惑: - (id) currentObject { return [Photo photo]; } - (void) checkObjectType { id object = [self currentObject]; ... } 在这种情况下,checkObjectType调用currentObject。currentObject然后返回一个Photo实例,然而,它正在创建一个新的Photo实例

我正在阅读一本关于可可和Objective-C的书。有一个例子让我感到困惑:

- (id) currentObject {
   return [Photo photo];
}

- (void) checkObjectType {
    id object = [self currentObject];
    ...
}
在这种情况下,checkObjectType调用currentObject。currentObject然后返回一个Photo实例,然而,它正在创建一个新的Photo实例并返回这个引用,不是吗?它不返回对自身的引用吗?我期待着这样的事情:

return self;
谢谢


Scott

是,
currentObject
正在返回
[Photo Photo]
的结果。假设遵循正常的Cocoa命名约定,
Photo
是一个类(因为它以大写字母开头),因此
+Photo
是一个类方法,它(大概)返回
Photo
类的实例。因为方法名不包含
alloc
copy
,我们可以进一步推断它返回一个自动释放的对象

“currentObject”方法名称在本例中肯定令人困惑,但这样做:

- (id) currentObject {
   return self;
}

这完全是毫无意义的:
[self currentObject]
就像说
self
我可能要把它顶起来,但这里是

您的代码段位于类中。该类有一个名为
currentObject
的方法,该方法返回一个
Photo
对象

id对象=[self-currentObject]

这要求当前类
self
调用方法
currentObject
,该方法恰好是
Photo
对象。拍摄该照片对象并将其分配给
对象

如果本书的这一部分讨论的是类型
id
,那么这似乎是一个静态的方法示例,该方法旨在展示类似
currentObject
(id)
方法如何返回任何类型的对象

也许更好的例子是:

- (id) currentObject:(NSString *)someKey {
   return [someDictionary objectForKey:someKey];
}

- (void) checkObjectType {
    id object = [self currentObject:@"photo"];
    ...
}

其中someDictionary包含多种对象,如NSString、Photo和NSURL。
currentObject
可以处理所有这些问题。

您一定是在参考Scott Stevenson的书。给出的示例只是试图演示如何使用
isMemberOfClass:
方法。除此之外,我不会再读下去了


你的困惑是可以理解的。正如您已经了解的那样,
currentObject:
方法返回一个新创建的自动释放对象,而不是其名称所暗示的对象本身。这是一个名称很差的方法。也许这只是一种鬼鬼祟祟的方式,提醒读者适当地命名方法。:)

哇!我印象深刻-你知道那是史蒂文森的书从代码片段?你一定记性很好。谢谢你的评论。好的。我明白你关于id变量类型的观点。你说“静态示例”是什么意思?如果该方法只返回一个Photo对象IMHO,那么它将被定义为:-(Photo)currentObject{…}如果它返回一个程序员不知道具体对象是什么的对象,那么它可以被定义为-(id)currentObject{…},因为(id)允许它处理任何对象。就这本书而言,作者可能还不想解决这个问题。