为什么执行:找不到withObject方法?

时间:2011-03-30 08:09:22

标签: objective-c xcode

我想在我的应用程序代码中修复警告。我有一个AddressBookModel.h来实现 TTModel 协议。

在这个问题的答案中,您可以找到AdressBookModel的界面和实现。这正是我实现它的方式How to use Three20 TTMessageController?

然而

[_delegates perform:@selector(modelDidStartLoad:) withObject:self];

和其他一些类似的选择器我得到像

这样的警告
Method -perform:withObject not found (return type defaults to id)

因为_delegates是一个数组

- (NSMutableArray*)delegates {
    if (!_delegates) {
        _delegates = TTCreateNonRetainingArray();
    }
    return _delegates;
}

有人建议使用makeObjectsPerformSelector,但这会给我unrecognized selector sent to instance例外。

以下是TTModel源代码:http://api.three20.info/protocol_t_t_model-p.php

为什么执行:withObject 缺失? performSelector:withObject是另一种选择(我的应用程序使用它崩溃了吗?)

4 个答案:

答案 0 :(得分:5)

_delegates是一个委托 s 的数组。它不是真正的代表,正如复数形式的名称所表示的那样。数组不响应-modelDidFinishLoad:方法 - 它的元素可以。

你需要将每个元素从数组中取出并调用它们的方法,例如

for (id<TTModelDelegate> delegate in _delegates)
   [delegate modelDidFinishLoad:self];

甚至更简单,使用NSArray's -makeObjectsPerformSelector:…

[_delegates makeObjectsPerformSelector:@selector(modelDidFinishLoad:)
                            withObject:self];

答案 1 :(得分:2)

执行:withObject:产生此警告的方法在Three20框架的NSArrayAdditions.h文件中的NSArray(TTCategory)类别中定义。您需要确保编译器正确导入/引用此标头,即您需要查看导入此特定标头或检查Three20集成配置。

您不需要将此方法更改为makeObjectsPerformSelector:因为这只是一个导入问题(您的代码运行正常,但只生成编译警告)。

答案 2 :(得分:1)

在行之间进行读取,看起来您希望 in _delegates数组中的对象都执行特定的选择器。您需要像这样致电-makeObjectsPerformSelector:withObject:

[_delegates makeObjectsPerformSelector: @selector(modelDidCancelLoad:) withObject: self];

答案 3 :(得分:0)

您输入的错误modelDidCancleLoad:应为modelDidCancelLoad:

'NSInvalidArgumentException', reason:
'-[__NSCFArray modelDidCancleLoad:]: unrecognized selector
 sent to instance 0x24f480'

确保您的_delegates符合您的期望。它似乎是一个NSArray。