Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 目标c中的内存问题_Iphone_Objective C_Xcode_Debugging - Fatal编程技术网

Iphone 目标c中的内存问题

Iphone 目标c中的内存问题,iphone,objective-c,xcode,debugging,Iphone,Objective C,Xcode,Debugging,我的应用程序正在尝试使用某个东西的僵尸实例,尽管我不知道问题出在哪里。调用(iAction)addTag:sender 我的堆栈跟踪如下: 2012-03-12 17:06:45.935 FavoriteTwitterSearches[3636:f803] -[__NSCFString addTag:]: unrecognized selector sent to instance 0x6a30d90 2012-03-12 17:06:45.943 FavoriteTwitterSearches

我的应用程序正在尝试使用某个东西的僵尸实例,尽管我不知道问题出在哪里。调用
(iAction)addTag:sender

我的堆栈跟踪如下:

2012-03-12 17:06:45.935 FavoriteTwitterSearches[3636:f803] -[__NSCFString addTag:]: unrecognized selector sent to instance 0x6a30d90
2012-03-12 17:06:45.943 FavoriteTwitterSearches[3636:f803] CRASH: -[__NSCFString addTag:]: unrecognized selector sent to instance 0x6a30d90
2012-03-12 17:06:45.947 FavoriteTwitterSearches[3636:f803] Stack Trace: (
    0   CoreFoundation                      0x013bc06e __exceptionPreprocess + 206
    1   libobjc.A.dylib                     0x0154dd0a objc_exception_throw + 44
    2   CoreFoundation                      0x013bdced -[NSObject doesNotRecognizeSelector:] + 253
    3   CoreFoundation                      0x01322f00 ___forwarding___ + 432
    4   CoreFoundation                      0x01322ce2 _CF_forwarding_prep_0 + 50
    5   CoreFoundation                      0x013bdec9 -[NSObject performSelector:withObject:withObject:] + 73
    6   UIKit                               0x000165c2 -[UIApplication sendAction:to:from:forEvent:] + 96
    7   UIKit                               0x0001655a -[UIApplication sendAction:toTarget:fromSender:forEvent:] + 61
    8   UIKit                               0x000bbb76 -[UIControl sendAction:to:forEvent:] + 66
    9   UIKit                               0x000bc03f -[UIControl(Internal) _sendActionsForEvents:withEvent:] + 503
    10  UIKit                               0x000bb2fe -[UIControl touchesEnded:withEvent:] + 549
    11  UIKit                               0x0003ba30 -[UIWindow _sendTouchesForEvent:] + 513
    12  UIKit                               0x0003bc56 -[UIWindow sendEvent:] + 273
    13  UIKit                               0x00022384 -[UIApplication sendEvent:] + 464
    14  UIKit                               0x00015aa9 _UIApplicationHandleEvent + 8196
    15  GraphicsServices                    0x012a6fa9 PurpleEventCallback + 1274
    16  CoreFoundation                      0x013901c5 __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__ + 53
    17  CoreFoundation                      0x012f5022 __CFRunLoopDoSource1 + 146
    18  CoreFoundation                      0x012f390a __CFRunLoopRun + 2218
    19  CoreFoundation                      0x012f2db4 CFRunLoopRunSpecific + 212
    20  CoreFoundation                      0x012f2ccb CFRunLoopRunInMode + 123
    21  GraphicsServices                    0x012a5879 GSEventRunModal + 207
    22  GraphicsServices                    0x012a593e GSEventRun + 114
    23  UIKit                               0x00013a9b UIApplicationMain + 1175
    24  FavoriteTwitterSearches             0x00001fab main + 187
    25  FavoriteTwitterSearches             0x00001ee5 start + 53
    26  ???                                 0x00000001 0x0 + 1
)
objc[3636]: EXCEPTIONS: finishing handler
支持文件/Main.m:

#import <UIKit/UIKit.h>

#import "AppDelegate.h"
void uncaughtExceptionHandler(NSException *exception);

int main(int argc, char *argv[])
{
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    int retVal;
    @try {
    retVal = UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));
    }
    @catch (NSException *exception) {
        NSLog(@"CRASH: %@", exception);
        NSLog(@"Stack Trace: %@", [exception callStackSymbols]);
    }
    @finally {
        [pool release];
    }
    return retVal;
}

[\uu NSCFString addTag:]:发送到实例的无法识别的选择器表示您正在对类型为
NSString
的实例调用方法
addTag:

检查什么对象以及IBAction在xib中是如何连接的。如果一切正常,请尝试清理项目,重置模拟器,然后重试


编辑:请将
NSLog
添加到您的
dealloc
中,以检查您的控制器是否尚未解除分配。

听起来很可能是控制器对象过早解除分配。从您发布的代码中不可能知道它发生在哪里,但是您应该能够通过工具(特别是僵尸和malloc堆栈日志)来跟踪它。或者,如果控制器在很多地方没有使用†,只需查看一下,看看是否错误地自动释放它,可能会更快


†对于一个名为“控制器”的对象,我不会打赌,但值得一提的是,能够轻松跟踪对象的生命周期是减少程序设计中耦合的一大激励因素。

如果他手动调用它,这并不重要,回溯显示这是来自用户点击控件。nib中的每件事情看起来都很好,清理了项目,重置了模拟器,然后重试。运气不好。+1用于光滑的
main
实现…当按钮仍然处于活动状态且在屏幕上时,您的
控制器正在解除锁定。控制器对象直接用于main.xib,并且在代码中没有其他直接引用。我该如何确保这一点保持分配状态,还是在将对象与主视图控制器合并时有更好的选择。
#import "Controller.h"

@implementation Controller
- (id)init
{
    if (self != nil)
    {
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *dir = [paths objectAtIndex:0];
        filePath = [[NSString alloc] initWithString:[dir stringByAppendingPathComponent:@"tagsIndex.plist"]];
        NSFileManager *fileManager = [NSFileManager defaultManager];

        if ([fileManager fileExistsAtPath:filePath] == NO)
        {
            tags = [[NSMutableDictionary alloc] init];
        }
        else
        {
            tags = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath];
        }

        buttons = [[NSMutableArray alloc] init];
        infoButtons = [[NSMutableArray alloc] init];
    }
    return self;
}

- (void)awakeFromNib
{
    for (NSString *title in tags)
        [self addNewButtonWithTitle:title];
}

- (void)refreshList
{
    for (UIButton *button in scrollView.subviews)
        [button removeFromSuperview];

    [infoButtons removeAllObjects];

    float buttonOffset = BUTTON_SPACING;

    for (UIButton *button in buttons)
    {
        CGRect buttonFrame = button.frame;
        buttonFrame.origin.x = BUTTON_SPACING;
        buttonFrame.origin.y = buttonOffset;
        buttonFrame.size.width = scrollView.frame.size.width - BUTTON_SPACING - BUTTON_HEIGHT;
        buttonFrame.size.height = BUTTON_HEIGHT;
        button.frame = buttonFrame;

        UIButton *infobutton = [UIButton buttonWithType:UIButtonTypeDetailDisclosure];
        [infoButtons addObject:infobutton];

        buttonFrame = infobutton.frame;
        buttonFrame.origin.x = scrollView.frame.size.width - BUTTON_SPACING - SCROLLBAR_WIDTH;
        buttonFrame.origin.y = buttonOffset;
        infobutton.frame = buttonFrame;

        [infobutton
         addTarget:self action:@selector(infoButtonTouched:)
         forControlEvents:UIControlEventTouchUpInside];
        [scrollView addSubview:infobutton];

        buttonOffset += BUTTON_HEIGHT + BUTTON_SPACING;
    }
}

- (void)infoButtonTouched:sender
{
    int index = [infoButtons indexOfObject:sender];

    NSString *key = [[buttons objectAtIndex:index] titleLabel].text;
    tagField.text = key;

    NSString *value = [tags valueForKey:key];
    queryField.text = value;
}

- (IBAction)addTag:sender
{
    [tagField resignFirstResponder];
    [queryField resignFirstResponder];

    NSString *key = tagField.text;
    NSString *value = queryField.text;

    if (value.length == 0 || key.length == 0) return;

    if ([tags valueForKey:key] == nil)
        [self addNewButtonWithTitle:key];

    [tags setValue:value forKey:key];

    tagField.text = nil;
    queryField.text = nil;

    [tags writeToFile:filePath atomically:NO];
}

- (IBAction)clearTags:sender
{
    [tags removeAllObjects];
    [tags writeToFile:filePath atomically:NO];
    [buttons removeAllObjects];
    [self refreshList];
}

- (void)addNewButtonWithTitle:(NSString *)title
{
    UIButton *button = [UIButton buttonWithType:UIButtonTypeRoundedRect];
    [button setTitle:title forState:UIControlStateNormal];
    [button
     addTarget:self action:@selector(buttonTouched:)
     forControlEvents:UIControlEventTouchUpInside];
    [buttons addObject:button];

    [buttons sortUsingSelector:@selector(compareButtonTitles:)];
    [self refreshList];

    CGSize contentSize = CGSizeMake(
                                scrollView.frame.size.width,
                                buttons.count * (BUTTON_HEIGHT + BUTTON_SPACING) + BUTTON_SPACING);
    [scrollView setContentSize:contentSize];
}

- (void)buttonTouched:sender
{
    NSString *key = [sender titleLabel].text;
    NSString *search = [[tags valueForKey:key]
                        stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding];
    NSString *urlString = [NSString stringWithFormat:
                           @"http://search.twitter.com/search?q=%@", search];
    NSURL *url = [NSURL URLWithString:urlString];
    [[UIApplication sharedApplication] openURL:url];
}
- (void)dealloc
{
    [filePath release];
    [tags release];
    [infoButtons release];
    [buttons release];
    [super dealloc];
}
@end

@implementation UIButton (sorting)
- (NSComparisonResult)compareButtonTitles:(UIButton *)button
{
    return [self.titleLabel.text caseInsensitiveCompare:button.titleLabel.text];
}
@end