【问题标题】:What's wrong with and extern NSMutableArray?和 extern NSMutableArray 有什么问题?
【发布时间】:2010-06-21 04:39:41
【问题描述】:

所以我一直在做大量的阅读。我终于能够声明一个 extern MutableArray 并从不同的视图访问它。我有两种看法: 1) 测试视图控制器 2) 测试2

我声明数组如下: TestingViewController.h

extern NSMutableArray *myArray;

#import <UIKit/UIKit.h>

@interface TestingViewController : UIViewController {

}

我在 TestingViewController 加载时初始化数组。 然后我可以从测试 2 中向其中添加对象,如下所示: 测试2.m

#import "Test2.h"

NSMutableArray *myArray;
@implementation Test2

-(IBAction)addToArray{
 [myArray addObject:@"Hot like Mexico"];
 NSLog(@"Object was added to Array! Count: %d",[myArray count]);
}

这似乎在两个视图中都有效。即使在切换时,计数和对象也是一致的。

我想知道的是,这有什么问题?我知道很多有经验的程序员讨厌全局变量,但我让它工作的唯一方法是像上面那样通过 AppDelegate (不想那样做)。只是想通过从多个视图中添加和操作数组来提高效率。

谢谢你们!

【问题讨论】:

  • Objective-C 中的全局变量如果在一个文件中声明,在另一个文件中初始化,然后在第三个文件中修改,会变得很棘手。
  • 你会推荐什么(阅读下面的评论)?

标签: iphone objective-c sdk nsmutablearray


【解决方案1】:

如果你真的需要一个“全局”对象,这里有一个我经常使用的简单模式 - 好吧,不是很多,因为我不会有很多全局对象。

决定你希望它属于哪个类。假设 Test2 是放置它的逻辑类。在 Test2 中创建一个方法来访问该变量。 (可以是类方法或实例方法)如下:

@interface Test2 : NSObject
{
    // ivars
}

+(NSMutableArray*) myArray;  // could also be an instance method

@end

@implementation Test2

+(NSMutableArray*) myArray
{
    static NSMutableArray* theValue = nil;
    @synchronized([Test2 class]) // in a single threaded app you can omit the sync block
    {
        if (theValue == nil)
        {
            theValue = [[NSMutableArray alloc] init];
        }
    }
    return theValue;
}
@end

编辑:使用类方法,从任何地方访问 myArray 只需这样做:

#import "Test2.h"

// To use class method, send messages to the class itself

[[Test2 myArray] addObject: @"foo bar"];
id foo = [[Test2 myArray] objectAtIndex: 0];

【讨论】:

  • 如何从 TestViewController 或其他视图访问 myArray?
【解决方案2】:

在内存管理方面,全局变量是一场噩梦,这在设计方面确实不是典型的做事方式。正确的做法是将myArray 声明为TestingViewController 中的属性,然后从Test2 访问该属性。

【讨论】:

  • 你如何管理这个?从理论上讲,我认为您必须在 Test2 中创建 TestingViewController 类的对象,并以某种方式从 Test2 访问它。你能提供一些我可以看的示例代码吗?
【解决方案3】:

【讨论】:

    【解决方案4】:

    全局变量的问题在于它们会激增。首先你有一个,然后你需要另一个,在不知不觉中,你已经有了几十个全局变量,你不确定变量在哪里被初始化和释放,每一次改变都需要永远,因为你不知道组件之间的依赖关系是什么。

    通常,您需要为程序中的每个资源指定一个所有者。在 Cocoa 应用程序中,各种控制器和委托对象为设计的各个部分提供了自然的责任层次结构。


    对于您需要在应用程序的多个视图中访问的对象的特定情况,您通常会通过视图控制器类的方法使该对象可用,然后确保每个视图都有一个引用回到控制器。

    例如,查看 UITableView 的任何示例。那里使用了一个相当复杂的数据源协议,但其他 UIKit 类有一个“委托”属性,该属性通常被初始化为一个为它们管理其部分状态的对象。

    【讨论】:

    • 如果您只需要一个可以从应用程序中的任何视图访问的数组,您会建议做什么?我还没有看到一个带有代码的工作示例:\
    • 如何在我的视图控制器中建立一个可以从另一个类访问的方法,并从不同的视图中引用它?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多