0

AsynUDPSocket クラスを使用して簡単なアプリを作成しました。UDP クライアントからの単純なテキスト メッセージをリッスンします。

関連するコードをView Controllerに入れると、すべて正常に動作します。しかし、アプリデリゲートで同じことを試みると、アプリがクラッシュします。このことは、数日前にアプリのデリゲートでうまく機能しました。今、私は何が悪いのかわかりません。

この投稿のコードを使用しました 。誰か詳しく教えてください。

編集:コード

My App Delegate の .h ファイルの内容

    //
//  MacSocketTestAppDelegate.h
//  MacSocketTest
//
//  Created by core on 04/05/11.
//  Copyright __MyCompanyName__ 2011. All rights reserved.
//

#import <UIKit/UIKit.h>

#import "AsyncUdpSocket.h"

#import "SocketController.h"
#import "NextController.h"


@class SocketController;

@class SocketTest;

@interface MacSocketTestAppDelegate : NSObject <UIApplicationDelegate> {
    UIWindow *window;

    SocketTest *connection;

    AsyncUdpSocket *aSyncSocket;

    UIViewController *currentViewController;
}

@property (nonatomic, retain) IBOutlet UIWindow *window;
@property (nonatomic, retain) IBOutlet SocketController *mySC;

@property (nonatomic, retain) SocketTest *connection;

@property (nonatomic, retain) AsyncUdpSocket *aSyncSocket;

@property (nonatomic, retain) UIViewController *currentViewController;

@end

My App Delegate の .m ファイルの内容

//
//  MacSocketTestAppDelegate.m
//  MacSocketTest
//
//  Created by core on 04/05/11.
//  Copyright __MyCompanyName__ 2011. All rights reserved.
//

#import "MacSocketTestAppDelegate.h"
#import "SocketController.h"
#import "SocketTest.h"

#import "NextController.h"

@implementation MacSocketTestAppDelegate

@synthesize window;
@synthesize mySC;
@synthesize connection;

@synthesize aSyncSocket;

@synthesize currentViewController;


#pragma mark -
#pragma mark Application lifecycle

- (BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions {    

    // Override point for customization after application launch.

    aSyncSocket=[[AsyncUdpSocket alloc] initWithDelegate:self]; //We are the delegate for the asynchronous socket object.

    [aSyncSocket bindToPort:30000 error:nil]; //We want to listen on port 30000. Don't care about errors for now.

    [aSyncSocket receiveWithTimeout:-1 tag:1]; //Start listening for a UDP packet.



    SocketTest *instanceST = [SocketTest alloc];
    [self setConnection:instanceST];

    SocketController *instanceSocketController = [[SocketController alloc] initWithNibName: @"SocketController" bundle: nil];
    [self setMySC:instanceSocketController];
    [instanceSocketController release];

    [[self window] setRootViewController:[self mySC]];

    [window makeKeyAndVisible];

    return YES;
}

     //Other methods hidden

#pragma mark AsyncUdpSocket Delegate Method

//This method is called by the AsyncUdpSocket object when a packet is received:
- (BOOL)onUdpSocket:(AsyncUdpSocket *)sock didReceiveData:(NSData *)data withTag:(long)tag fromHost:(NSString *)host port:(UInt16)port
{
    NSString *theLine=[[NSString alloc] initWithData:data encoding:NSASCIIStringEncoding]; //Convert the UDP data to an NSString

    NSLog(@"%@", theLine);

    [theLine release];

    [aSyncSocket receiveWithTimeout:-1 tag:1]; //Listen for the next UDP packet to arrive...which will call this method again in turn.

    return YES; //Signal that we didn't ignore the packet.
}


- (void)dealloc {
    [window release];
    [super dealloc];
}


@end

編集:クラッシュログ

The Debugger has exited with status 0.
[Session started at 2011-05-05 15:29:18 +0530.]
GNU gdb 6.3.50-20050815 (Apple version gdb-1469) (Wed May  5 04:36:56 UTC 2010)
Copyright 2004 Free Software Foundation, Inc.
GDB is free software, covered by the GNU General Public License, and you are
welcome to change it and/or distribute copies of it under certain conditions.
Type "show copying" to see the conditions.
There is absolutely no warranty for GDB.  Type "show warranty" for details.
This GDB was configured as "x86_64-apple-darwin".sharedlibrary apply-load-rules all
Attaching to process 1706.
Pending breakpoint 1 - ""MacSocketTestAppDelegate.m":41" resolved
MacSocketTest(1706) malloc: recording malloc stacks to disk using standard recorder
MacSocketTest(1706) malloc: stack logging compaction turned off; size of log files on disk can increase rapidly
MacSocketTest(1706) malloc: process 1547 no longer exists, stack logs deleted from /tmp/stack-logs.1547.MacSocketTest.bEuUBJ.index
MacSocketTest(1706) malloc: stack logs being written into /tmp/stack-logs.1706.MacSocketTest.SJLaue.index
(gdb) continue
Current language:  auto; currently objective-c
2011-05-05 15:29:46.698 MacSocketTest[1706:207] *** -[MacSocketTestAppDelegate respondsToSelector:]: message sent to deallocated instance 0x5954e00
(gdb)

ありがとう、アンジェロ。

4

2 に答える 2

1

ええと、あなたが私たちに提供している情報で、おそらくメモリ管理を台無しにしていると思います. それがクラッシュの最も一般的な原因だからです。

この投稿のコードを使用しました。

何のポスト?この投稿にはコードはありません。

クラッシュの統計的理由だけに基づいていない適切な回答を得るには、コード、クラッシュ ログ、およびスタック トレースを提供する必要があります。

編集:リンクで編集しました。これで、いくつかのコードができました。ただし、そのコードは文脈から外れており、それが機能することはすでに述べているため、そこに答えを見つけることはできません.

編集2:

2011-05-05 15:29:46.698 MacSocketTest[1706:207] *** -[MacSocketTestAppDelegate respondsToSelector:]: message sent to deallocated instance 0x5954e00

だから私は正しかった。メモリの問題でした。割り当て解除されたオブジェクトにメッセージを送信しています。奇妙なのは、割り当てが解除されたアプリ デリゲートのように見えることです。

于 2011-05-05T08:10:30.367 に答える
0

エリック、あなたのコメントは的を射ていました。問題の場所がわかりました。

説明させてください: コメントしたように、アプリのデリゲートから 1 つの画面に移動し、その画面から別の画面に移動しています。

本質的に、最後の画面の (ビューの) ビュー コントローラーで、アプリ デリゲートのインスタンスを作成して、最後の画面のビュー コントローラーをアプリ デリゲートの currentViewController プロパティとして設定していました。いろいろな理由で維持しています。

また、currentViewController プロパティの設定が完了した直後に、アプリ デリゲートのインスタンスを DEALLOCATING しました。その行を削除すると、私は元気になり、アプリが起動して実行されました.

dealloc メソッドで割り当てを解除する必要があると思います。私が間違っている場合は、私の理解を修正してください。

エリック、私を正しい方向に向けてくれてありがとう。

編集: エリック、クラッシュ ログから、私のアプリ デリゲートが割り当て解除されていることをどうやって知ったのか教えてください。

アンジェロ。

于 2011-05-06T10:44:39.160 に答える