Невозможно присвоить значение переменной в Objective-C для iOS - PullRequest
0 голосов
/ 12 марта 2012

Я пытаюсь использовать iOS StackPanel, найденную здесь в моем собственном проекте.

Я включил файлы Stackpanel. * В свой проект, и для проверки функциональности я скопировалдемонстрационный код, который включен в файл AppDelegate исходного проекта в мой проект в качестве действия для нажатия кнопки.Проблема в том, что я не могу установить значение self.stackPanel (или использовать [self setStackPanel :).В любом случае значение self.stackPanel остается nil .

Соответствующие разделы кода приведены ниже:

// From StackPanelAppDelegate.h (copied to MyViewController.h)
#import "StackPanel.h"

@interface MyNavViewController : UIViewController <UITextFieldDelegate>
{
   StackPanel *stackPanel;
}
@property(strong, nonatomic) IBOutlet StackPanel *stackPanel;
@end

// From StackPanelAppDelegate.m (copied to MyViewController.m)
#import "StackPanel.h"

@implementation MyNavViewController
@synthesize stackPanel;

-(IBAction)myButtonPress:(id)sender
{
   // Doesn't set correctly
   self.stackPanel = [[StackPanel alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
   ...
   // More code that adds things to the StackPanel
}

Я знаю, что методы alloc и initWithFrame: являютсяработает правильно, потому что я создал другой StackPanel * и мог установить его значение в результате initWithFrame :.Другими словами,

-(IBAction)myButtonPress:(id)sender
{
   // This works
   StackPanel* panel = [[StackPanel alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
   ...
   // More code that adds things to the StackPanel
}

Я упускаю здесь что-то базовое, что не позволит мне установить значение для свойства stackPanel?

Единственная другая мысль, которую я имею, заключается в том, что оригиналкод не использует ARC, но мой проект использует, поэтому я удалил все операторы release и retain, чтобы компилятор был доволен.Я довольно новичок в ARC, но могли ли эти изменения изменить ситуацию?

Ответы [ 2 ]

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

Я наконец-то понял.Это была скорее проблема отладчика, чем проблема с самим кодом.

Для всех, кто может бороться с подобной проблемой, вот несколько вещей, которые я узнал об этом приключении:

Цель-C требует ключевое слово self при использовании свойств.Другими словами:

self.stackPanel = [[StackPanel alloc] init];  // Sets value of stackPanel property
stackPanel = [[StackPanel alloc] init];  // Sets value of stackPanel instance variable

Они обычно одинаковы, поскольку @synthesize stackPanel создает вспомогательную переменную с именем stackPanel.Проблема возникла из-за того, что в коде StackPanel, который я пытался использовать, также была объявленная отдельно переменная stackPanel, маскирующая синтезированную переменную поддержки.Таким образом, в моем случае stackPanel и self.stackPanel указали на 2 разных места в памяти.

Я не уверен, что это вызвало имя синтезированной переменной, но это заставило отладчик не отображать ее правильно.

Для менее бесполезного отладчика перейдите в Product -> Edit Schemes в Xcode и выберите Run Имя проекта в левой части.Установите отладчик в GDB, если это еще не так.Это должно привести к более полезным результатам, пока мы ждем, пока Apple завершит отладку своего отладчика.

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

Вы пробовали это? Не знаете, зачем вам нужно использовать self?

@property(nonatomic, retain) IBOutlet StackPanel *stackPanel;

....

stackPanel = [[StackPanel alloc] initWithFrame:CGRectMake(0, 0, 320, 480)];
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...