微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ios – 在Objective-C中使用类似C的静态变量是不好的做法吗?

我想做的就是为我的(流捕获)应用程序创建一个实用程序类,从我的网站获取设置.我想从其他文件调用它作为一个简单的[RemoteConfig updateSettings];

我的目标是使用这个远程配置实用程序,而不是为我抓取远程设置的每种情况制作一个对象.

Objective C中的静态/类变量方法的信息是模糊的,非常自以为是,所以经过大量的实验,我得到了这个.但它看起来很有趣,这让我觉得有些不对劲.

RemoteConfig.h只是声明(void)updateSettings方法.

这是我的RemoteConfig.m:

#import "RemoteConfig.h"

static NSMutableData* _configData;
static Nsstring* url = @"http://local.namehidden.com:90/json.html";
static int try;

@implementation RemoteConfig

+(void) updateSettings
{
    Nsstring *identifier = [[[UIDevice currentDevice] identifierForvendor] UUIDString];

    //Create URL request
    NSMutableuRLRequest *request = [NSMutableuRLRequest requestWithURL:[NSURL URLWithString:url]
                                                           cachePolicy: NSURLRequestReloadIgnoringCacheData
                                                       timeoutInterval: 10];

    [request setHTTPMethod: @"POST"];
    Nsstring *post = [Nsstring stringWithFormat:@"id=%@",identifier];
    NSData *postData = [post dataUsingEncoding:NSUTF8StringEncoding];
    [request setHTTPBody:postData];

    NSURLConnection* connection = [NSURLConnection connectionWithRequest:request
                                                                delegate:self];
    [connection start];
}

///////////////////////////// DELEGATE METHODS ///////////////////////////////////

+(void)connection:(NSConnection*)conn didReceiveResponse:(NSURLResponse*)response
{
       if (_configData == NULL) {
        _configData = [[NSMutableData alloc] init];
    }
    [_configData setLength:0];
    NSLog(@"didReceiveResponse: responseData length:(%d)",_configData.length);
}

/// and so on...

它看起来很时髦,将C风格的变量放在@interface / @实现之上.很多人说尝试使用属性,有人说做静态方法单例技巧,我见过一个处理单例的小库,但这是我发现的最简单的解决方案.

我的问题 –

>这听起来很糟糕吗?
>这有什么限制?
>有哪些替代方案,什么是最好的?

解决方法

Is this proverbially bad? What limitations does this have?

全局变量往往会施加一系列限制:

>他们通常不会妥善清理资源
>不是线程安全的(例如,可以从一个线程使用或者可以为每个线程引入状态)
>它们可能不一定安全
>他们可以通过序列化请求来解决其中的一些问题 – 引入过多的暂停和锁定.
>它们变得非常难以安全地“扩展”(即添加全局变量使其更加脆弱)
>它们很难测试,并且可能导致很难再现的错误

What are the alternatives,and what is best?

只需将这些变量移动到ivars,并创建类的实例而不是依赖于全局状态.然后,您可以以不会显着影响客户的方式进行扩展和抽象.

注意静态Nsstring * const url = @“http://local.namehidden.com:90/json.html”;不会是一个可变变量(添加const).所以它只是_configData并尝试哪些需要是ivars.

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐