Russian Qt Forum
Май 02, 2024, 14:20 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Objective-C. Карманный справочник  (Прочитано 6525 раз)
serg_yl
Гость
« : Сентябрь 26, 2012, 07:57 »

Всем привет!

В книге Дэвида Чиснелла «Objective-C. Карманный справочник, читал про дерективу synthesize и то как она синтезирует методы доступа к переменной объекта (60 или 61 стр.). После описания чего да как, идет предложение "В этом случае компилятор сформирует метод с правильной семантикой для текущего режима компиляции". Не совсем понятно что автор имели ввиду.
Пожалуйста, объясните начинающему программисту смысл этого предложения.
Спасибо.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #1 : Сентябрь 26, 2012, 12:10 »

ну в следующем предложении же всё чётко объяснено: подразумевается используемый режим управления памятью (ручной, ARC, GC), что компилятор сам корректно перегенерирует все синтезированные методы в случае изменения режима управления памятью и разработчику не нужно ничего делать для этого.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
serg_yl
Гость
« Ответ #2 : Сентябрь 26, 2012, 13:21 »

Спасибо! Подмигивающий
Записан
serg_yl
Гость
« Ответ #3 : Сентябрь 30, 2012, 13:17 »

Пример такого плана.
Есть класс описанный след. образом.
Код
Objective-C
@interface testClass : NSObject
{
NSString *title;
}
@property (nonatomic, assign, readonly) NSString *title;
@and
И есть его реализация с неким содержанием и неким методом.
Код
Objective-C
@implementaion testClass
..........
-(void) testMetod
{
self.title = nil;
}
@and
В этом случае будет ошибка в строке self.title = nil; - Assigment to readonly property.

Что нужно поставить чтобы эта строчка была верной? При этом не прописывая вручную setter и getter методы, и не меняя свойство readonly для тех, кто будет обращаться к этому объекты из вне.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #4 : Сентябрь 30, 2012, 17:18 »

вставить в .m перед @implementaion testClass:
Код
Objective-C
@interface testClass ()
@property (nonatomic, assign) NSString *title;
@end

строки лучше конечно объявлять copy а не assign, а то вызывающий код может сделать гадость:
Код
Objective-C
testClass *t = [[testClass alloc] init];
NSString *s = t.title;
[s release]; // дальше к t.title уже обращаться нельзя
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
serg_yl
Гость
« Ответ #5 : Октябрь 02, 2012, 17:27 »

Спасибо! Веселый
Записан
serg_yl
Гость
« Ответ #6 : Октябрь 02, 2012, 21:48 »

Вот еще один примерчик. Улыбающийся
Есть 2 класса, файлы объявления такие:
Код
Objective-C
#import "test2.h"
@protocol test1Delegate <NSObject>
-(void)test1Method;
@end
 
@interface test1 : NSObject <test2Delegate>
{
test2 *testObject2;
}
@end;
 

Код
Objective-C
#import "test2.h"
@protocol test2Delegate <NSObject>
-(void)test2Method;
@end
 
@interface test2 : NSObject <test1Delegate>
{
test1 *testObject1;
}
@end;
 

Программа не запуститься с таким кодом. Почему? И как исправить?

По моим соображениям, программа не запуститься потому что для работы с NSObject нужно обязательно подключить #import <Foundation/Foundation.h>. Второе, поменять в первом файле в объявлении класса в угловых скобках название протокола с test2Delegate на test1Delegate и поменять тип переменной с test2 на test1. За тем, аналогичным образом, сделать тоже самое во втором файле.

Поправьте меня если не так.
Записан
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4727



Просмотр профиля WWW
« Ответ #7 : Октябрь 03, 2012, 01:02 »

есть предложение взять и попробовать скомпилировать код, а не строить догадки — компилятор точно знает что можно а чего нельзя.

всякие UIKit и Foundation обычно подключают в pch и забывают о них.

test2 должен реализовывать test2Delegate а не test1Delegate. обычно в classname.h располагают @interface classname, а не то, как тут написано.
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.13 секунд. Запросов: 23.