iOS ivar alloc / init назначает адрес памяти другому ivar - PullRequest
1 голос
/ 13 марта 2012

Я объявил два NSMutableArrays в интерфейсе одного из моих контроллеров представления, как вы можете видеть в коде ниже.Однако после синтеза свойств я пытаюсь инициализировать ивары моего класса в viewDidLoad.Если я перехожу через этот процесс в отладчике, я вижу, что он компенсирует выделение памяти одним иваром, если это имеет смысл.Так, например, когда я инициализирую первый NSMutableArray, я могу наблюдать, как адрес памяти присваивается другому ивару NSMutableArray.NSMutableArray, который должен инициализировать код, остается нулевым адресом памяти.Это странное «смещение» в распределении памяти является попыткой инициализации второго NSMutableArray тоже ... оно инициализируется в ячейке памяти моего DataHelper ivar.Это приводит к тому, что позже в коде появляются ошибки, такие как:

-[DataHelper count]: unrecognized selector sent to instance

Когда он ожидает ссылку на NSMutableArray в памяти, он вместо этого указывает на адрес памяти DataHelper.Кто-нибудь когда-либо испытывал что-то подобное?Я использую ARC, последнюю версию XCode и iOS 5.1.

MyViewController.h

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

@interface MyViewController : UIViewController
{
    DataHelper *dataHelper;
    NSMutableArray *recentPosts;
    NSMutableArray *popularPosts;
}

@property (nonatomic, strong) DataHelper *dataHelper;
@property (nonatomic, strong) NSMutableArray *recentPosts;
@property (nonatomic, strong) NSMutableArray *popularPosts;

@end

viewDidLoad в MyViewController.m

@implementation MyViewController

@synthesize dataHelper, recentPosts, popularPosts;

- (void)viewDidLoad
{
    [super viewDidLoad];

    recentPosts = [[NSMutableArray alloc] init];
    popularPosts = [[NSMutableArray alloc] init];
    dataHelper = [[DataHelper alloc] init];

    // I've also tried initializing the ivars as above, with "self." prefix

    recentPosts = [dataHelper getSuggestionsByMostRecent:1];
    popularPosts = [dataHelper getSuggestionsByPopular:1];
}

Ответы [ 3 ]

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

ARC ожидает, что имена ваших методов будут соответствовать соглашениям о присвоении имен какао (-touch) getSuggestionsByMostRecent нарушает это соглашение.Особенно этот:

Используйте «get» только для методов, которые возвращают объекты и значения косвенно.Вы должны использовать эту форму для методов только тогда, когда необходимо вернуть несколько элементов.

, который будет правильным методом get (хотя и не очень хорошим): - (void)getString:(NSString **)str

Без использования правильной схемы именования ARC не знает, куда добавить сохранение или выпуск.

Попробуйте переименовать ваш метод во что-то вроде suggestionsSortedByMostRecent:.Без получения.

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

Есть проблемы со считыванием памяти LLDB в XCode (4.3.1, похоже, тоже затронуты), поэтому я предлагаю вам использовать GDB для отладки.

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

Я бы синтезировал так:

@synthesize dataHelper = _dataHelper;
// same for the other two here

и используйте только _dataHelper.

А для добавления постов вы не хотите делать это вместо этого:

[_recentPosts addObjectsFromArray:[_dataHelper getSuggestionsByMostRecent:1]];
...