warning:performSelector may cause a leak because its selector

来源:互联网 发布:发起淘宝众筹的条件 编辑:程序博客网 时间:2024/05/29 17:36

【解决方法】
if ([target respondsToSelector:callback]){

//    [target performSelector:callback withObject:nil];   

 IMP imp = [target methodForSelector:callback];   

 void (*func)(id, SEL) = (void *)imp;    func(target, callback);

}这样就不会报warning了。

或者

在ARC项目中使用 performSelector: withObject: 函数出现“performSelector may cause a leak because its selector is unknown”。在stackoverflow找到了一个解决方案,地址:http://stackoverflow.com/questions/7017281/performselector-may-cause-a-leak-because-its-selector-is-unknown。

主要是警告信息,在非ARC项目中没有这个警告。如果是在某一处修改只需要加入下列代码:

 

<code style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu sans Mono', 'Bitstream Vera sans Mono', 'Courier new', monospace, serif;"><span style="word-wrap: normal; word-break: normal; line-height: 21px; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; color: gray;">#pragma</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;"> clang diagnostic push</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; color: gray;">#pragma</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;"> clang diagnostic ignored </span><span style="word-wrap: normal; word-break: normal; line-height: 21px; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; color: rgb(128, 0, 0);">"-Warc-performSelector-leaks"</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">    </span><span style="word-wrap: normal; word-break: normal; line-height: 21px; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">[</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">self</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">.</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">ticketTarget performSelector</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">:</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;"> self</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">.</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">ticketAction withObject</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">:</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;"> self</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">];//此处是你调用函数的地方</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;"></span><span style="word-wrap: normal; word-break: normal; line-height: 21px; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; color: gray;">#pragma</span><span style="word-wrap: normal; word-break: normal; line-height: 21px; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;"> clang diagnostic pop</span></code>
<code style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu sans Mono', 'Bitstream Vera sans Mono', 'Courier new', monospace, serif;"><span style="word-wrap: normal; word-break: normal; line-height: 21px; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">如果在程序中多处使用,可以写一个宏定义,如下:</span></code>
</pre><pre name="code" style="white-space: pre-wrap; color: rgb(50, 62, 50); font-size: 14px; line-height: 21px; background-color: rgb(85, 115, 79); word-wrap: break-word; margin-top: 0px; margin-bottom: 10px; padding: 5px; border: 0px; vertical-align: baseline; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu sans Mono', 'Bitstream Vera sans Mono', 'Courier new', monospace, serif; overflow: auto; width: auto; max-height: 600px;"><code style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu sans Mono', 'Bitstream Vera sans Mono', 'Courier new', monospace, serif;"><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; color: gray;">#define</span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;"> </span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; color: rgb(43, 145, 175);">SuppressPerformSelectorL<wbr>eakWarning</wbr></span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">(</span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; color: rgb(43, 145, 175);">Stuff</span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">)</span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;"> \    </span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; color: rgb(0, 0, 139);">do</span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;"> </span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">{</span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;"> \        </span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; color: rgb(43, 145, 175);">_Pragma</span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">(</span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; color: rgb(128, 0, 0);">"clang diagnostic push"</span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">)</span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;"> \        </span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; color: rgb(43, 145, 175);">_Pragma</span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">(</span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; color: rgb(128, 0, 0);">"clang diagnostic ignored "-Warc-performSelector-leaks""</span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">)</span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;"> \        </span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; color: rgb(43, 145, 175);">Stuff</span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">;</span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;"> \        </span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; color: rgb(43, 145, 175);">_Pragma</span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">(</span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; color: rgb(128, 0, 0);">"clang diagnostic pop"</span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">)</span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;"> \    </span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">}</span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;"> </span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; color: rgb(0, 0, 139);">while</span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;"> </span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">(</span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; color: rgb(128, 0, 0);">0</span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">)</span></code>
如果没有返回结果,可以直接按如下方式调用:
</pre><pre name="code" style="white-space: pre-wrap; color: rgb(50, 62, 50); font-size: 14px; line-height: 21px; background-color: rgb(85, 115, 79); word-wrap: break-word; margin-top: 0px; margin-bottom: 10px; padding: 5px; border: 0px; vertical-align: baseline; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu sans Mono', 'Bitstream Vera sans Mono', 'Courier new', monospace, serif; overflow: auto; width: auto; max-height: 600px;"><code style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu sans Mono', 'Bitstream Vera sans Mono', 'Courier new', monospace, serif;"><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; color: rgb(43, 145, 175);">SuppressPerformSelectorL<wbr>eakWarning</wbr></span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">(</span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">    </span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">[</span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">_target performSelector</span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">:</span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">_action withObject</span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">:</span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">self</span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">]</span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;"></span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">);</span></code>
如果要返回结果,可以按如下方式调用:
</pre><pre name="code" style="white-space: pre-wrap; color: rgb(50, 62, 50); font-size: 14px; line-height: 21px; background-color: rgb(85, 115, 79); word-wrap: break-word; margin-top: 0px; margin-bottom: 10px; padding: 5px; border: 0px; vertical-align: baseline; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu sans Mono', 'Bitstream Vera sans Mono', 'Courier new', monospace, serif; overflow: auto; width: auto; max-height: 600px;"><code style="margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; font-family: Consolas, Menlo, Monaco, 'Lucida Console', 'Liberation Mono', 'DejaVu sans Mono', 'Bitstream Vera sans Mono', 'Courier new', monospace, serif;"><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">id result</span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">;</span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;"></span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline; color: rgb(43, 145, 175);">SuppressPerformSelectorL<wbr>eakWarning</wbr></span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">(</span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">    result </span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">=</span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;"> </span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">[</span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">_target performSelector</span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">:</span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">_action withObject</span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">:</span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">self</span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">]</span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;"></span><span style="word-wrap: normal; word-break: normal; margin: 0px; padding: 0px; border: 0px; vertical-align: baseline;">);</span></code>
0 0