9

まず、stackoverflow で提供されているほとんどすべてのソリューションを試しましたが、グローバル変数の実装に成功しませんでした。ステップバイステップのチュートリアルを実行しても、同じエラーが発生します。

ここに問題があります:

複数のビューを持つプログラムがあり、すべてのビューで変数を使用したいので、グローバル変数を使用しました。

私は持っている:

GlobalVars.h

#import <UIKit/UIKit.h>
extern NSArray *truckBoxes;
extern NSArray *farmerlist;
extern NSString *farmerCardNumber;

extern NSString *fName;

@interface GlobalVars : NSObject
{
}

@end

GlobalVars.m

#import "GlobalVars.h"

NSArray *farmerlist;
NSArray *truckBoxes;
NSString *farmerCardNumber;
NSString *fName;
@implementation GlobalVars
{

}
@end

クラスにファイルを含めます(View Controllerに接続されています):.hファイルの下に追加します#import "GlobalVars.h

アプリ全体からfarmerlistとにアクセスできますが、またはにアクセスできません。truckBoxesfNamefarmerCardNumber

同じビューに読み書きできますfarmerCardNumberが、後で別のビューからアクセスしようとすると、

2013-10-26 11:11:45.612 C3Cms[10427:70b] Branch : 11558
2013-10-26 11:11:59.459 C3Cms[10427:70b] -[__NSArrayM length]: unrecognized selector sent to instance 0x8b7fbc0
2013-10-26 11:11:59.463 C3Cms[10427:70b] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayM length]: unrecognized selector sent to instance 0x8b7fbc0'
*** First throw call stack:
(
    0   CoreFoundation                      0x02a3b5e4 __exceptionPreprocess + 180
    1   libobjc.A.dylib                     0x014d58b6 objc_exception_throw + 44
    2   CoreFoundation                      0x02ad8903 -[NSObject(NSObject) doesNotRecognizeSelector:] + 275
    3   CoreFoundation                      0x02a2b90b ___forwarding___ + 1019
    4   CoreFoundation                      0x02a2b4ee _CF_forwarding_prep_0 + 14
    5   Foundation                          0x00f0db2d -[NSConcreteMutableAttributedString replaceCharactersInRange:withString:] + 39
    6   Foundation                          0x00f0e79a -[NSConcreteMutableAttributedString initWithString:attributes:] + 293
    7   UIKit                               0x001e8116 -[UILabel _setText:] + 97
    8   UIKit                               0x001e82d4 -[UILabel setText:] + 40
    9   C3Cms                               0x00001c1d -[printForm viewDidLoad] + 77
    10  UIKit                               0x0014e9a8 -[UIViewController loadViewIfRequired] + 696
    11  UIKit                               0x0014ec44 -[UIViewController view] + 35
    12  UIKit                               0x00168a72 -[UINavigationController _startCustomTransition:] + 778
    13  UIKit                               0x00175757 -[UINavigationController _startDeferredTransitionIfNeeded:] + 688
    14  UIKit                               0x00176349 -[UINavigationController __viewWillLayoutSubviews] + 57
    15  UIKit                               0x002af39d -[UILayoutContainerView layoutSubviews] + 213
    16  UIKit                               0x000a5dd7 -[UIView(CALayerDelegate) layoutSublayersOfLayer:] + 355
    17  libobjc.A.dylib                     0x014e781f -[NSObject performSelector:withObject:] + 70
    18  QuartzCore                          0x030d772a -[CALayer layoutSublayers] + 148
    19  QuartzCore                          0x030cb514 _ZN2CA5Layer16layout_if_neededEPNS_11TransactionE + 380
    20  QuartzCore                          0x030cb380 _ZN2CA5Layer28layout_and_display_if_neededEPNS_11TransactionE + 26
    21  QuartzCore                          0x03033156 _ZN2CA7Context18commit_transactionEPNS_11TransactionE + 294
    22  QuartzCore                          0x030344e1 _ZN2CA11Transaction6commitEv + 393
    23  QuartzCore                          0x03034bb4 _ZN2CA11Transaction17observer_callbackEP19__CFRunLoopObservermPv + 92
    24  CoreFoundation                      0x02a0353e __CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__ + 30
    25  CoreFoundation                      0x02a0348f __CFRunLoopDoObservers + 399
    26  CoreFoundation                      0x029e13b4 __CFRunLoopRun + 1076
    27  CoreFoundation                      0x029e0b33 CFRunLoopRunSpecific + 467
    28  CoreFoundation                      0x029e094b CFRunLoopRunInMode + 123
    29  GraphicsServices                    0x029979d7 GSEventRunModal + 192
    30  GraphicsServices                    0x029977fe GSEventRun + 104
    31  UIKit                               0x0003b94b UIApplicationMain + 1225
    32  C3Cms                               0x00002882 main + 130
    33  libdyld.dylib                       0x019bc70d start + 1
)
libc++abi.dylib: terminating with uncaught exception of type NSException
4

6 に答える 6

33

グローバル変数を実装し、それらの有効期間を管理し (つまり初期化する)、さらにはグローバル メソッドを提供する 1 つの方法は、これらの変数/メソッドを公開するクラスを実装し、シングルトン パターンを使用することです。

GlobalVars.h:

#import <Foundation/Foundation.h>

@interface GlobalVars : NSObject
{
    NSMutableArray *_truckBoxes;
    NSMutableArray *_farmerlist;
    NSString *_farmerCardNumber;
    NSString *_fName;
}

+ (GlobalVars *)sharedInstance;

@property(strong, nonatomic, readwrite) NSMutableArray *truckBoxes;
@property(strong, nonatomic, readwrite) NSMutableArray *farmerList;
@property(strong, nonatomic, readwrite) NSString *farmerCardNumber;
@property(strong, nonatomic, readwrite) NSString *fName;

@end

GlobalVars.m:

#import "GlobalVars.h"

@implementation GlobalVars

@synthesize truckBoxes = _truckBoxes;
@synthesize farmerList = _farmerList;
@synthesize frameCardNumber = _frameCardNumber;
@synthesize fName = _fName;

+ (GlobalVars *)sharedInstance {
    static dispatch_once_t onceToken;
    static GlobalVars *instance = nil;
    dispatch_once(&onceToken, ^{
        instance = [[GlobalVars alloc] init];
    });
    return instance;
}

- (id)init {
    self = [super init];
    if (self) {
        _truckBoxes = [[NSMutableArray alloc] init];
        _farmerlist = [[NSMutableArray alloc] init];
        // Note these aren't allocated as [[NSString alloc] init] doesn't provide a useful object
        _farmerCardNumber = nil;
        _fName = nil;
    }
    return self;
}

@end

次に、これらのグローバル変数を次のように使用できます。たとえば、次のようになります。

GlobalVars *globals = [GlobalVars sharedInstance];
globals.fName = @"HelloWorld.txt";
[globals.farmerList addObject:@"Old Macdonald"];
[self processList:[globals farmerList]];

ただし、次のことを考慮してください。

  • このようなグローバル変数を使用する必要はありません。必要に応じて作成されるモデルオブジェクトを作成し、それへの参照をビューに渡すことができるはずです。これが MVC です。
  • また、Objective-C で非常に一般的な無関係の問題のスタック トレースも投稿しました。このエラーを修正できるのは、それが何であるかを理解した後だけです。
于 2013-10-26T09:05:26.943 に答える
4

エラーはグローバル変数とは関係ありません。エラーメッセージ

-[__NSArrayM length]: unrecognized selector sent to instance 0x8b7fbc0

は、コードのどこかで の 代わりに を割り当てたNSMutableArrayことを示します。farmerCardNumberNSString

たとえば、次のようなことをすると

farmerCardNumber = [someDictionary objectForKey:@"someKey"];

[someDictionary objectForKey:@"someKey"]たまたま文字列ではなく配列farmerCardNumberある場合、文字列へのポインターとして宣言されていたとしても、その配列を指します。

于 2013-10-26T08:28:27.883 に答える
1

私はすべてのプロジェクトで使用しており、正常に動作しています。

GlobalResource.h

#import <Foundation/Foundation.h>

@class GlobalResource;

extern GlobalResource * R;

@interface GlobalResource : NSObject
{
    NSString *myVar;
}
+ (void) loadGlobalResources;

@property (strong, nonatomic, readwrite) NSString *myVar;

@end

GlobalResource.m

#import "GlobalResource.h"

GlobalResource *R;

@implementation GlobalResource

@synthesize myVar;

- (void) loadGlobalResources
{
    R = [[GlobalResource alloc] init];
}

- (id)init
{
    self = [super init];
    if (self) {
        myVar = @"My Value";
    }

    return self;
}

@end

使い方

#import "GlobalResource.h"

//then access value as bellow

[GlobalResource loadGlobalResource];
NSLog(@"%@",R.myVar); //value will print here
于 2016-03-02T07:11:07.897 に答える
0

次のようなことを試してみませんか:

#import "GlobalVars.h"

NSArray *farmerlist;
NSArray *truckBoxes;
NSString *farmerCardNumber = nil;
NSString *fName = nil;
@implementation GlobalVars
{

}
@end

また

#import "GlobalVars.h"

NSArray *farmerlist;
NSArray *truckBoxes;
NSString *farmerCardNumber = @"";
NSString *fName = @"";
@implementation GlobalVars
{

}
@end

そして、可変配列を文字列変数に渡したようです。そのため、そのエラーが発生しています。

于 2013-10-26T08:38:55.110 に答える
-1

*.h ファイルに extern 変数を入れることはできません。

したがって、GlobalVariables.m には次のものがあります。

extern NSArray *farmerlist;
NSArray *farmerlist;

と:

@interface GlobalVars : NSObject
{
}

@end

@implementation GlobalVars
{

}
@end

必要ありません

[編集]

例えば:

その他.m

#import "GlobalVars1.h"

GlobalVars1.h

extern NSArray *truckBoxes;
extern NSArray *farmerlist;
extern NSString *farmerCardNumber;

extern NSString *fName;

GlobalVars.h

#import <UIKit/UIKit.h>

@interface GlobalVars : NSObject
{
}

@end

GlobalVars.m

#import "GlobalVars.h"

NSArray *farmerlist;
NSArray *truckBoxes;
NSString *farmerCardNumber;
NSString *fName;
@implementation GlobalVars
{

}
@end
于 2013-10-26T08:25:17.550 に答える
-1

線を取り除く

#import "GlobalVars.h"

GlobalVars.m から。

于 2013-10-26T08:23:43.147 に答える