14

最新の SDK を使用して iOS 5.0 以降のアプリを開発しています。

このコードで非常に奇妙なエラーが発生します。

- (NSMutableURLRequest*)setupRequestWithService:(NSString*)service andMethod:(NSString*)method
{
    NSString* url = [NSString stringWithFormat:@"%@%@.svc/%@", serverUrl, service, method];

    NSMutableURLRequest* request = [[NSMutableURLRequest alloc] initWithURL:[NSURL URLWithString:url]];

    // Set authentication token.
    NSLog(@"???????????? %@", authenticationToken);
    if (authenticationToken == nil)
        NSLog(@"NULL AUTHTOKEN");
    if ([authenticationToken isEqual:[NSNull null]])
        NSLog(@"NSNULL AUTHTOKEN");
    if (request == nil)
        NSLog(@"NULL REQUEST");
    [request addValue:authenticationToken forHTTPHeaderField:REQUEST_HEADER_AUTH_TOKEN];

    return request;
}

これは私のログです:

???????????? <null>
NSNULL AUTHTOKEN
-[NSNull length]: unrecognized selector sent to instance 0x3b5a5090
    *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[NSNull length]: unrecognized selector sent to instance 0x3b5a5090'

のようauthenticationTokenですNULL。しかし、それがログに表示されない理由でauthenticationTokenある場合、私はそれを理解していません。NULLNULL AUTHTOKEN

このメソッドを 2 回目に実行するとこのエラーが発生しますが、最初はエラーは発生しません。これは私のログです:

???????????? (null)
NULL AUTHTOKEN

ところで:

NSString* authenticationToken;

何かアドバイス?

Memory Leakどこかにあるのかな…

4

4 に答える 4

6

エラーメッセージはかなり明確です。NSNullnilは異なるものです:

The NSNull class defines a singleton object used to represent null values in 
collection objects (which don’t allow nil values).

かどうかを確認したい場合authenticationTokenは、次をNSNull試してください。[authenticationToken isEqual: [NSNull null]]

于 2013-05-17T11:39:03.890 に答える
2

David Hの回答に沿って、NSNullObjCのメッセージ転送を使用して「何もしない」だけのカテゴリで、にメッセージを送信するときのランタイムの動作をエミュレートするのはnilどうですか?

このような:

@interface NSNull (ForwardInvocation)

@end

@implementation NSNull (ForwardInvocation)

- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector {
    return [NSNull methodSignatureForSelector:@selector(description)];
}

- (void)forwardInvocation:(NSInvocation *)anInvocation {
    // do nothing; prevent 'unrecognized selector' crashes
}

@end

は、 がメソッドを提供する から継承されているという[NSNull methodSignatureForSelector:@selector(description)];事実を利用しています。これにより、 を実装するための転送メカニズムの要件が満たされます。NSNullNSObjectdescription-methodSignatureForSelector:

于 2014-04-11T09:22:27.300 に答える
0

メソッドが NSNull オブジェクトを返すため、問題が発生します。オブジェクトのインスタンスを与えるため、[authenticationToken isEqual:[NSNull null]])チェックできません。[NSNull null]したがって、オブジェクト自体とは異なります。NSNull オブジェクトを受け取ったかどうかを確認したい場合は、[authenticationToken isKindOfClass:[NSNull class]]代わりに次のように確認する必要があります。

于 2016-03-30T08:56:19.713 に答える