используя дугу, мои ивары становятся нулевыми после инициализации - PullRequest
0 голосов
/ 06 марта 2012

САМЫЕ НОВЫЕ ИСПЫТАНИЯ: Я поместил NSLog(@"%p", self.myArray); после назначения массива, и я вижу адрес на самом деле зарегистрировано .....!?!?!

2012-03-06 01:33:52.618 ArrayTest[9883:f803] 0xae0f160

Похоже, что XCode полностью отключен, если он не может увидеть адрес этого ивара в локальных переменных или с помощью метода выделения подсказок ...

Мысли

НОВОЕ ИСПЫТАНИЕ: Я создал новый проект.

Кажется, что простое назначение объектов ивару не работает вообще. Если я посмотрю адрес myArray после присвоения вновь созданного массива, он будет иметь нулевой адрес.

вывод nslog

2012-03-06 01:30:37.283 ArrayTest[9848:f803] (
)
(lldb) 

//
//  ViewController.h
//  ArrayTest
//
//  Created by Ben J Brown on 3/6/12.
//  Copyright (c) 2012StudioBflat. All rights reserved.
//

#import <UIKit/UIKit.h>

@interface ViewController : UIViewController
{
    NSMutableArray *myArray;

}

@property (strong) NSMutableArray *myArray;

@end


//
//  ViewController.m
//  ArrayTest
//
//  Created by Ben J Brown on 3/6/12.
//  Copyright (c) 2012 StudioBflat. All rights reserved.
//

#import "ViewController.h"

@implementation ViewController

@synthesize myArray;

- (void)viewDidLoad
{
    [super viewDidLoad];
    // Do any additional setup after loading the view, typically from a nib.

    NSMutableArray *array = [NSMutableArray arrayWithCapacity:16];
    self.myArray = array;

NSLog (@ "% @", self.myArray); }

- (void)viewDidUnload
{
    [super viewDidUnload];
    // Release any retained subviews of the main view.
}

- (BOOL)shouldAutorotateToInterfaceOrientation:(UIInterfaceOrientation)interfaceOrientation
{
    if ([[UIDevice currentDevice] userInterfaceIdiom] == UIUserInterfaceIdiomPhone) {
        return (interfaceOrientation != UIInterfaceOrientationPortraitUpsideDown);
    } else {
        return YES;
    }
}

@end

СТАРЫЕ ДАННЫЕ:

На мой взгляд, у меня есть:

NSLog(@"%@",self.collectionOfImageViews);
    self.collectionOfImageViews = [[NSMutableArray alloc] initWithCapacity:NUMBER_OF_COLUMNS*NUMBER_OF_ROWS];
     NSLog(@"%@",self.collectionOfImageViews);

Однако позже, когда я обращаюсь к этому массиву, у массива есть адрес, но все объекты, которые я добавил к нему, исчезают, и когда я посылаю сообщение подсчета этому объекту (NSMutableArray), он выдает это в консоли:

-[UIImage count]: unrecognized selector sent to instance 0x6b7ab40

Мои свойства в моем интерфейсе:

@property(strong) NSMutableArray* collectionOfImageViews;

и у меня @synthesize collectionOfImageViews; сразу после моего @implmentation ... что мне здесь не хватает?

Вот где я делаю коллекцию:

  NSLog(@"%@",self.collectionOfImageViews);
    self.collectionOfImageViews = [[NSMutableArray alloc] initWithCapacity:NUMBER_OF_COLUMNS*NUMBER_OF_ROWS];
     NSLog(@"%@",self.collectionOfImageViews);

глядя на массив, он имеет нулевой адрес сразу после этого действия ....

Что касается той странной ошибки, которая раньше утешала меня тем, что это был UIImage, не отвечающий на count ... Я исправил это, изменив порядок объявлений ivar в интерфейсе:

#import <UIKit/UIKit.h>
#import "TiledImageView.h"


@interface ViewController : UIViewController <TiledImageViewDelegation>
{

    NSMutableArray *collectionOfImageViews;
    UIImage *sourceImage;
    UIImageView *currentTappedView;
}



@property(strong) NSMutableArray* collectionOfImageViews;
@property(strong) UIImage* sourceImage;
@property(strong) UIImageView* currentTappedView;

@end

Что касается того, где я заполняю изменяемый массив позже, вот этот код:

iView = [[TiledImageView alloc] initWithImage:[UIImage imageWithCGImage:tempImage]];
                iView.userInteractionEnabled = YES;
                iView.delegate = self;
                iView.contentMode = UIViewContentModeScaleAspectFit;
                [iView setTag:index];
                [iView setPosX:column];
                [iView setPosY:row];

            [collectionOfImageViews addObject:iView];

Я немного сбит с толку, потому что это простая установка и получение ивара ... и выделение и инициализация ... то, что я делал много раз раньше, но кажется, что мои ивы не остаются в живых ... Я новичок в ARC.

Ответы [ 2 ]

1 голос
/ 07 марта 2012

Это похоже на ошибку LLDB.Вместо этого используйте GDB для отладки.

edit: Очевидно, это ошибка в lldb, я подал отчет об ошибке в марте (он был помечен как дубликат другой ошибки, которая позже была помечена как закрытая) -проблема была решена в более новых версиях Xcode.

0 голосов
/ 07 марта 2012

Тот факт, что u get () означает, что с массивом все в порядке. Вы можете легко проверить это, добавив любой другой объект, такой как NSNumber, а затем снова войдя в массив, вы должны увидеть там свой объект. Об адресе памяти. Если вы используете отладчик, вы должны установить точку останова ПОСЛЕ инструкции, в которой расположен массив, тогда вы сможете увидеть содержимое массива. В противном случае, если вашей точки останова нет, кто знает, что вы увидите.

Наконец, - [UIImage count]: нераспознанный селектор отправлен на экземпляр 0x6b7ab40 Означает, что вы пытаетесь заставить объект UIImage выполнить метод count, который не существует. Вы, вероятно, хотите, чтобы счетчик в массиве, а не объект внутри. Таким образом, проблема в том, что когда вы вызываете этот метод, вам кажется, что вам трудно обращаться к объекту или ивуру, чтобы избежать этого при изменении синтеза @synthesize collectionOfImageViews; @synthesize collectionOfImageViews = collectionOfImageViews;

Также попробуйте изменить компилятор, как предлагали другие.

...