Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

Objective-C

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.70
Adem
6 / 6 / 0
Регистрация: 17.04.2009
Сообщений: 34
#1

Доступ к NSMutableDictionary - Objective-C

08.01.2012, 00:38. Просмотров 1248. Ответов 9
Метки нет (Все метки)

Всем доброго времени суток.

Проблема вот в чём:
есть класс MyView:
Objective-C
1
2
3
4
5
6
7
8
@interface MyView : NSView {
    NSMutableDictionary *directions;
    NSRect playerRed, playerBlue;
}
 
@property (retain, readonly) NSMutableDictionary *directions;
 
@end
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
@implementation MyView
 
@synthesize directions;
 
- (id)initWithFrame:(NSRect)frame
{
    self = [super initWithFrame:frame];
    if (self) {
        directions = [NSMutableDictionary dictionaryWithObjectsAndKeys:@"STOP", @"playerRed", @"STOP", @"playerBlue", nil];
        NSLog(@"%@", [directions description]);
    }
    
    return self;
}
 
- (void)drawRect:(NSRect)dirtyRect
{
    NSRect bounds = [self bounds];
    [[NSColor blackColor] set];
    [NSBezierPath fillRect:bounds];
    [[NSColor blueColor] set];
    [NSBezierPath fillRect:playerBlue];
    [[NSColor redColor] set];
    [NSBezierPath fillRect:playerRed];
}
 
- (BOOL)acceptsFirstResponder
{
    return YES;
}
 
- (BOOL)resignFirstResponder
{
    [self setNeedsDisplay:YES];
    return NO;
}
 
- (BOOL)becomeFirstResponder
{
    [self setNeedsDisplay:YES];
    return YES;
}
 
- (BOOL)canBecomeKeyView
{
    return YES;
}
 
- (void)keyDown:(NSEvent *)theEvent
{
    NSLog(@"%@" ,[directions description]);
}
 
- (void)dealloc
{
    [directions release];
    [super dealloc];
}
@end
Вызов [directions description] в методе init отрабатывает нормально, а вот когда нажимаю клавишу, то получаю ошибку, либо какой-то мусор из памяти. Не подскажете, в чём дело?

Добавлено через 32 минуты
Решил проблему увеличением счётчика ссылок на единицу при инициализации. А почему он опускается до 0 во время работы?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.01.2012, 00:38
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Доступ к NSMutableDictionary (Objective-C):

Доступ из VPN-сети в локалку; Доступ к внешнему ресурсу мимо прокси - FreeBSD
Доброго времени суток, господа эксперты! Нужен совет/консультация в решении одной небольшой задачки. Собственно суть задачи: Вопрос...

На одном компьютере доступ в Интернет и на 2 сетевой карте доступ в домашнюю сеть - Сети
На одном компьютере через 1 сетевую карту есть подключение к Интернет от провайдера "Кабинет" IP-адрес: 94.31.166.196 ...

Закрыть доступ к серверу определенному компьютеру, сохранив доступ в сеть - Администрирование Windows
Приветствую! Как закрыть доступ к серверу определенному компьютеру? Лучше по имени, тк ip динамические, чтобы всякий раз не определять. ...

Ограниченный доступ к сети через 5 минут теряется доступ к интернету - Wi-Fi
Добрый день,требуется помощь. У меня через роутер tp-link по wifi подключен ноутбук. Но через 5 минут исчезает доступ к интернету и не...

Доступ к mySQL возможен только через Shell доступ. Что это значит ? - MySQL
навеяло отсюда http://www.cyberforum.ru/php-beginners/thread462521.html не могу понять скрипт есть который по ssh по рса ключу...

Доступ к mySQL возможен только через Shell доступ. Что это значит ? - PHP
Доступ к mySQL возможен только через Shell доступ. Что это значит ? На меня завели БД mySQL и выслали следующую информацию: > Имя базы:...

9
rkorin
4 / 4 / 0
Регистрация: 05.09.2011
Сообщений: 19
08.01.2012, 19:18 #2
Because dictionaryWithObjectsAndKeys always return autoreleased objects.
1
Santer.Net
15 / 15 / 1
Регистрация: 18.11.2010
Сообщений: 122
18.02.2012, 23:37 #3
При выборе конструктора всегда важно понимать какой метод вы используете для создании объекта. Т.е. статический или метод экземпляра класса. Потому что это влияет на способ управления памятью. В случае [NSMutableArray alloc] init]; Конструктор является методом экземпляра и в данном случае вы сами следите за количеством ссылок на объект и сами потом его релизите( посылаете release). В вашем случаем метод статический поэтому автоматически помещается в пул и его релизить не надо. Т.е. вы не следите за количеством ссылок этим занимается пул, соответственно такие объекты вы самостоятельно не релизите.
0
Adem
6 / 6 / 0
Регистрация: 17.04.2009
Сообщений: 34
21.03.2012, 09:52  [ТС] #4
Снова возник вопрос по памяти:

Есть класс со свойством
Objective-C
1
2
3
4
5
@interface SomeController : UIViewController
 
@property (strong, nonatomic) UIActivityIndicatorView *indicator;
 
@end
В методе initWithNibName я хочу создать это свойство и использовать его во ViewDidLoad:
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
@implementation SomeController
 
@synthesize indicator = _indicator;
 
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        self.indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleWhiteLarge];
        self.indicator.hidesWhenStopped = YES;
    }
    return self;
}
 
- (void)viewDidLoad
{
    [super viewDidLoad];
    self.indicator.center = self.view.center;
    [self.view addSubview:self.indicator];
    [self.indicator startAnimating];
}
 
@end
И тут получается, что я не могу использовать индикатор во ViewDidLoad, потому что он удалился из памяти. Раньше бы я добавил вызов retain при инициализации, а что делать в ARC?
0
zulkis
682 / 609 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
22.03.2012, 05:35 #5
Adem, Не верю я Вам. Где то Вы нас обманываете. Так, как вы написали будет работать.
Я надеюсь nib файл то вы указываете верный при вызове initWithNibName:bundle:?
Если верный, то все будет хорошо.
0
Adem
6 / 6 / 0
Регистрация: 17.04.2009
Сообщений: 34
22.03.2012, 22:46  [ТС] #6
Цитата Сообщение от zulkis Посмотреть сообщение
Adem, Не верю я Вам. Где то Вы нас обманываете. Так, как вы написали будет работать.
Я надеюсь nib файл то вы указываете верный при вызове initWithNibName:bundle:?
Если верный, то все будет хорошо.
В главном контроллере я создаю второй и показываю представление с помощью presentModalViewController(второй контроллер создаётся без nib-файла, а просто кодом).

Во втором контроллере происходит такое:
Objective-C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
- (id)initWithNibName:(NSString *)nibNameOrNil bundle:(NSBundle *)nibBundleOrNil
{
    self = [super initWithNibName:nibNameOrNil bundle:nibBundleOrNil];
    if (self) {
        self.view.backgroundColor = [UIColor colorWithRed:1.0/255.0*57.0 green:1.0/255.0*154.0 blue:1.0/255.0*255.0 alpha:1.0];
        self.indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
        self.indicator.hidesWhenStopped = YES;
    }
    return self;
}
 
- (void)viewDidLoad
{
    [super viewDidLoad];
//    self.indicator = [[UIActivityIndicatorView alloc] initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray];
//    self.indicator.hidesWhenStopped = YES;
    NSLog(@"INDICATOR: %@", [self.indicator description]);
    if(!self.authWebView) {
        self.authWebView = [[UIWebView alloc] initWithFrame:self.view.bounds];
        self.authWebView.delegate = self;
        self.authWebView.scalesPageToFit = YES;
    }
    
    [self.view addSubview:self.authWebView];
    self.indicator.center = self.view.center;
    [self.view addSubview:self.indicator];
    
    NSString *authString = @"http://";
    NSURL *url = [NSURL URLWithString:authString];
    [self.indicator startAnimating];
    [self.authWebView loadRequest:[NSURLRequest requestWithURL:url]];
}
В этом случае индикатор не работает, и NSLog() выводит null. Если раскомментировать 15 и 16 строчки и убрать 6 и 7, то всё работает, как я хочу.
0
zulkis
682 / 609 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
23.03.2012, 13:03 #7
Будьте добры интерфейс второго контроллера покажите?

Добавлено через 7 часов 0 минут
Вообще, в -init элементы UI Создавать не очень корректно.
Для этого есть другие методы.

А то, что у Вас релизится элемент - Скорее всего вы в интерфейсе написали:
C++
1
UIActivityIndicatorView *indicator;
Вместо:
C++
1
__strong UIActivityIndicatorView *indicator;
0
Adem
6 / 6 / 0
Регистрация: 17.04.2009
Сообщений: 34
24.03.2012, 13:09  [ТС] #8
Objective-C
1
2
3
4
5
6
7
8
9
#import <UIKit/UIKit.h>
 
@interface LoginController : UIViewController <UIWebViewDelegate, UIAlertViewDelegate>
 
@property (strong, nonatomic) UIWebView *authWebView;
@property (weak, nonatomic) id delegate;
@property (strong, nonatomic) UIActivityIndicatorView *indicator;
 
@end
0
zulkis
682 / 609 / 38
Регистрация: 13.01.2011
Сообщений: 1,724
25.03.2012, 08:21 #9
Только что специально попробовал как у Вас. Все работает. Да и не может не работать.
Где то еще видимо чтото не так.
1
Adem
6 / 6 / 0
Регистрация: 17.04.2009
Сообщений: 34
25.03.2012, 15:11  [ТС] #10
Да, создал заново приложение, всё заработало. Просто наворотил какую-то хрень с контроллерами... Пардон)
0
25.03.2012, 15:11
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
25.03.2012, 15:11
Привет! Вот еще темы с ответами:

Server 2008 Доступ к RDP - учетная запись не имеет прав на доступ к удаленному рабочему столу - Windows Server
Доброго времени суток! Такая проблема: пользователи находятся в одной группе в домене, кому из группы подключаться со своей учеткой к RDP...

Доступ - Access Denied. Закрыт доступ к локальному диску - Windows Vista
Стоит Home Premium на диске &quot;C:&quot;. Сегодня не с того и с сего отрубилось 2 диска. 1 диск разбит на две части, еще один диск целый. Система...

Общий доступ (DHCP) в Windows 7, доступ к серверным ресурсам - Windows 7
Для начала опишу как сделанно: Есть Серверный ПК, с двумя сетевухами, одна инет, вторая локаль. Локаль поключенна к свитчу, далее инет...

Доступ управляемый доступ к базе MySQL через апплет - Java EE
хочу написать аплет. Планирую подключить базу и выложить на сайте. Доступ к аплету будет на закрытой странице и открыт некоторому кругу...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
10
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru