【问题标题】:How can I solve this warning in iOS? Memory Leak如何在 iOS 中解决此警告?内存泄漏
【发布时间】:2014-05-02 06:01:00
【问题描述】:

函数中的这一行会产生一个警告:PerformSelector 可能会导致内存泄漏,因为它的选择器是未知的。我做错了什么?

- (void)connectionDidFinishLoading:(NSURLConnection *)connection {

[_delegate1 performSelector:_selector1 withObject:json];

}

下面是performSelector方法

- (void)HttpRequest:(NSURL*)url PostString:(NSString *)poststring method:(int)method withselector:(SEL)selector withdelegate:(id)delegate
{    

 _responseData = [[NSMutableData alloc] init];
// procedures for parse at desired URL
request = [NSMutableURLRequest requestWithURL:url
                                  cachePolicy:NSURLRequestReloadIgnoringLocalAndRemoteCacheData
                              timeoutInterval:5];

// set HTTP method
if (method == 0) {
    [request setHTTPMethod:@"GET"];
    // asks xml response
    [request setValue:@"application/json" forHTTPHeaderField:@"Accept"]; }

_selector1 = selector ;
_delegate1 = delegate ;

[self startConnection];

return;
}

【问题讨论】:

    标签: ios memory memory-leaks warnings


    【解决方案1】:

    您没有做错任何事情。编译器会发出警告,因为它还不知道选择器。 如果您在某个地方收到此警告,请使用

    #pragma clang diagnostic push
    #pragma clang diagnostic ignored "-Warc-performSelector-leaks"
           [_delegate1 performSelector:_selector1 withObject:json];
    #pragma clang diagnostic pop
    

    如果有多个地方可以定义宏

    #define SuppressPerformSelectorLeakWarning(Stuff) \
        do { \
            _Pragma("clang diagnostic push") \
            _Pragma("clang diagnostic ignored \"-Warc-performSelector-leaks\"") \
            Stuff; \
            _Pragma("clang diagnostic pop") \
        } while (0)
    

    然后在所有引起警告的地方使用宏

    SuppressPerformSelectorLeakWarning(
    
       [_delegate1 performSelector:_selector1 withObject:json];
    );
    

    像这样调用每个选择器,它会抑制警告

    【讨论】:

    • @user3178926 欢迎!!
    猜你喜欢
    • 2020-04-07
    • 1970-01-01
    • 1970-01-01
    • 2011-01-16
    • 2011-10-23
    • 1970-01-01
    • 2015-06-28
    相关资源
    最近更新 更多