我想在我的应用程序代码中修复警告。我有一个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
是另一种选择(我的应用程序使用它崩溃了吗?)
答案 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。