【问题标题】:how to call a variable of another class without using objects or class methods?如何在不使用对象或类方法的情况下调用另一个类的变量?
【发布时间】:2013-05-27 06:22:23
【问题描述】:

在我的应用程序中,一个通用类中有一个常量,定义为

#define IMG_INIT_URL @"http://www.xxxx/index.php"

现在我需要将其更改为变量。但我的问题是我在代码中经常使用此常量,例如:

NSString *imgUrlString = [NSString stringWithFormat:@"%@%@",IMG_INIT_URL,[[[storeDet objectForKey:@"store_imgurls"] objectAtIndex:0]objectForKey:@"simg_imgurl"]];

当我将它更改为一个变量时,我必须通过需要在我的代码中进行大量编辑的对象或类方法来检索它。那么我可以像现在一样维护代码吗(即,不使用对象或类方法访问变量)?

【问题讨论】:

    标签: ios objective-c macros


    【解决方案1】:

    您可以将定义更改为

    #define IMG_INIT_URL [UIApplication.sharedApplication imgInitURL]
    

    然后在您的 UIApplication 子类或 UIApplication 类别中添加- (NSString *)imgInitURL 方法。或者,如果这样更方便,可以将方法添加到应用程序委托并相应地修改定义。

    【讨论】:

    • NSApplication?在 iOS 中?你的意思可能是UIApplicationDelegate
    • 感谢您的回答。还有一件事,这是一个根地址。我还有一些定义为常量的 url。现在我将它们定义为静态的。我可以定义它们与 IMG_INIT_URL 相关吗?
    • @manujmv:这取决于静态变量声明的上下文。如果它在方法体内,则上述内容应该可以工作。否则,可能尚未定义应用程序对象。在这种情况下,您可以在某个类上定义一个类方法+ (NSString *)imgInitURL,并将定义更改为[MyClass imgInitURL]。在这种情况下,您还需要在您的应用程序预编译 (.pch) 标头中包含 MyClass 标头,以便随处可见方法定义。
    【解决方案2】:

    假设您在名为 Constants 的单例类中定义了属性 imgURL,您可以这样做:

    #define IMG_INIT_URL [Constants sharedInstance].imgURL
    

    另外,请查看Edit > Refactor 下的 XCode 重构。

    【讨论】:

      【解决方案3】:

      您始终可以在.pch 文件中定义它,该文件通常位于Supporting Files 文件夹中,因此您需要在需要的地方使用它。我个人还包括一些我需要在不同类中使用的类。然后,我不需要包含在我使用的每个类中。

      【讨论】:

        【解决方案4】:

        你可以像下面这样使用 NSUserDefault

        [[NSUserDefaults standardUserDefaults] setValue:@"http://www.xxxx/index.php" forKey:@"IMG_INIT_URL"];
        

        并使用您想要的任何地方访问它。

         NSString *aReturnValue = [[NSUserDefaults standardUserDefaults] valueForKey:@"IMG_INIT_URL"];
        

        【讨论】:

          【解决方案5】:

          您可以通过在 AppDelegate 类中设置变量来实现。按照给定的方式在 AppDelegate.h 中创建一个变量,

          @property (strong, nonatomic) NSString *imageInitURL;
          

          并在 AppDelegate .m 文件中合成它

          @synthesize imageInitURL;
          

          如果你想设置初始值,你可以在“application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions”方法中设置

          [self setImageInitURL:@"http://www.xxxx/index.php"];
          

          然后您可以通过 appDelegate 共享实例从任何类访问它,就像给定的一样,

          AppDelegate *appDelegate = (AppDelegate *)[[UIApplication sharedApplication] delegate];
          [appDelegate imageInitURL];
          

          同样的方式,你可以从任何类中设置新值,比如给定

          [appDelegate setImageInitURL:@"your new URL"];
          

          希望对你有帮助:)

          【讨论】:

          • 感谢您的回复。但在你的回答中,无论我在哪里使用这个常量,我都必须更改代码。我的问题是如何避免这种情况?
          • #define 不是常数。它只是将名称替换为您为此定义的名称。
          猜你喜欢
          • 2014-03-10
          • 2023-03-24
          • 2023-04-01
          • 2018-12-19
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-21
          相关资源
          最近更新 更多