Russian Qt Forum

Разное => Говорилка => Тема начата: serg_yl от Сентябрь 26, 2012, 07:57



Название: Objective-C. Карманный справочник
Отправлено: serg_yl от Сентябрь 26, 2012, 07:57
Всем привет!

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


Название: Re: Objective-C. Карманный справочник
Отправлено: kambala от Сентябрь 26, 2012, 12:10
ну в следующем предложении же всё чётко объяснено: подразумевается используемый режим управления памятью (ручной, ARC, GC), что компилятор сам корректно перегенерирует все синтезированные методы в случае изменения режима управления памятью и разработчику не нужно ничего делать для этого.


Название: Re: Objective-C. Карманный справочник
Отправлено: serg_yl от Сентябрь 26, 2012, 13:21
Спасибо! ;)


Название: Re: Objective-C. Карманный справочник
Отправлено: serg_yl от Сентябрь 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 для тех, кто будет обращаться к этому объекты из вне.


Название: Re: Objective-C. Карманный справочник
Отправлено: kambala от Сентябрь 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 уже обращаться нельзя


Название: Re: Objective-C. Карманный справочник
Отправлено: serg_yl от Октябрь 02, 2012, 17:27
Спасибо! :D


Название: Re: Objective-C. Карманный справочник
Отправлено: serg_yl от Октябрь 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. За тем, аналогичным образом, сделать тоже самое во втором файле.

Поправьте меня если не так.


Название: Re: Objective-C. Карманный справочник
Отправлено: kambala от Октябрь 03, 2012, 01:02
есть предложение взять и попробовать скомпилировать код, а не строить догадки — компилятор точно знает что можно а чего нельзя.

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

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