我正在编写一本关于Cocoa和Objective-C的书。一个例子让我难过:
- (id) currentObject {
return [Photo photo];
}
- (void) checkObjectType {
id object = [self currentObject];
...
}
在这种情况下,checkObjectType调用currentObject。然后,currentObject返回Photo的一个实例,然而,它正在创建一个新的Photo实例并返回此引用,不是吗?是不是不回复自己的引用?我期待的是:
return self;
谢谢,
斯科特
答案 0 :(得分:2)
你一定是指斯科特史蒂文森的书。给出的示例只是试图展示如何使用isMemberOfClass:
方法。我不会再读它了。
你的困惑是可以理解的。正如您已经想到的那样,currentObject:
方法返回一个新创建的自动释放对象,不该对象本身,因为它的名称将暗示。这是一个命名不佳的方法。也许这只是一种提醒读者恰当地命名方法的偷偷摸摸的方式。 :)
答案 1 :(得分:1)
我可能会把它搞砸但是这里......
您的代码段在一个类中。该类有一个名为currentObject
的方法,它返回一个Photo
对象。
id object = [self currentObject];
这要求当前的类self
调用方法currentObject
,这恰好是Photo
对象。拍摄该照片对象并将其指定给object
如果本书的部分正在讨论类型id
,那么这似乎是方法的一个静态示例,旨在说明(id)
方法如currentObject
如何返回任何方法一种对象。
也许有一个更好的例子:
- (id) currentObject:(NSString *)someKey {
return [someDictionary objectForKey:someKey];
}
- (void) checkObjectType {
id object = [self currentObject:@"photo"];
...
}
其中someDictionary包含各种对象,如NSString,Photo和NSURL。 currentObject
可以处理所有问题。
答案 2 :(得分:0)
是的,currentObject
正在返回[Photo photo]
的结果。假设正在遵循正常的Cocoa命名约定,Photo
是一个类(因为它以大写字母开头),因此+photo
是一个类方法(可能)返回{{1的实例} .class。由于方法名称不包含Photo
或alloc
,因此我们可以进一步推断它返回一个自动释放的对象。
“currentObject”方法名称在这个例子中确实令人困惑,但这样做:
copy
完全没有意义:- (id) currentObject {
return self;
}
与说[self currentObject]