Форум: "Основная";
Текущий архив: 2005.07.25;
Скачать: [xml.tar.bz2];
ВнизБывают ли объекты с self=nil? Найти похожие ветки
← →
Bless © (2005-07-04 16:07) [0]Посмотрел в модуле system реализацию метода TObject.Free:
procedure TObject.Free;
begin
if Self <> nil then
Destroy;
end;
Что, разве могут быть случаи, когда Self=nil?
← →
begin...end © (2005-07-04 16:16) [1]> Bless © (04.07.05 16:07)
> Что, разве могут быть случаи, когда Self=nil?
TObject(nil).Free
← →
Гаврила © (2005-07-04 16:17) [2]Var
MyObj: TMyObj;
...
MyObj:=nil;
MyObj.SomeMethod;
внутри SomeMethod Self как раз будет равен nil
← →
-=XP=- © (2005-07-04 16:17) [3]TObject(nil).Free;
← →
Stakan © (2005-07-04 16:17) [4]Бывают.
var
O: Tobject;
begin
O := nil;
O.Free;
end;
← →
isasa © (2005-07-04 16:18) [5]на самом деле точка входа в метод описывается как
procedure TObject.Free(self: pointer);
т.е. self не глобальная переменная.
← →
Stakan © (2005-07-04 16:18) [6]Не успел :(
← →
Гаврила © (2005-07-04 16:19) [7]В дополнение
SomeMethod должен быть статическим. Иначе мы туджа не попадем - вывалимся при попытке определения адреса в VMT.
В принципе, такая ситуация (в случае статичесмкого метода) может быть нормальной. Разумеется ,в жтом случае нельзя обращаться к полям объекта и вызывать виртуальные (динамические) методы.
← →
begin...end © (2005-07-04 16:19) [8]> Гаврила © (04.07.05 16:17) [2]
> внутри SomeMethod Self как раз будет равен nil
Уточнение: если SomeMethod не является классовым методом.
← →
Bless © (2005-07-04 17:04) [9]Спасибо
← →
Игорь Шевченко © (2005-07-04 17:42) [10]
> Бывают ли объекты с self=nil?
Не бывают.
← →
ANB © (2005-07-04 17:59) [11]
> Игорь Шевченко © (04.07.05 17:42) [10]
Хм. А Self можно в методе присвоить nil, тогда получится . . .
← →
Digitman © (2005-07-04 18:03) [12]
> А Self можно в методе присвоить nil, тогда получится
если долго дрючиться, то что-нибудь обязательно получится.
← →
Игорь Шевченко © (2005-07-04 18:16) [13]ANB © (04.07.05 17:59) [11]
> Хм. А Self можно в методе присвоить nil, тогда получится
> . . .
Не получится.
← →
Гаврила © (2005-07-04 19:46) [14]Не получится потому ,что эта ссылка передается по значению (см. [5]).
то есть присвоить то можно, только эффекта от этого за границами метода не будет
← →
Kerk © (2005-07-04 21:59) [15]
rocedure TForm1.FormCreate(Sender: TObject);
var
MyProc: procedure of object;
begin
TMethod(MyProc).Code := @TForm1.Test;
TMethod(MyProc).Data := nil;
MyProc;
end;
procedure TForm1.Test;
begin
if Self = nil then MessageBox(0,0,0,0);
end;
← →
evvcom © (2005-07-05 08:26) [16]Как уже было сказано мастерами объектов с Self = nil не бывает. Если Self = nil, то очевидно объекта уже (или еще) нет. Во всяком случае указателя на объект точно нет. А все эти извращения вокруг TObject(nil).SomeMethod это именно извращения. В методе Free сделали такую проверку, наверное, из-за того что существует такое: FreeAndNil. Хотя, кто их знает, кому это вообще пригодилось? У меня есть четкое правило, кто вызывает конструктор, тот вызывает и деструктор. Ну, за малыми исключениями. И никаких повторных вызовов Free.
← →
Anatoly Podgoretsky © (2005-07-05 08:38) [17]evvcom © (05.07.05 08:26) [16]
из-за того что существует такое: FreeAndNil
Наоборот, эту нетипизираную функцию сделали после для любителей повторного использования объектоа, спекулируя на способности Free проверять на nil.
← →
Игорь Шевченко © (2005-07-05 11:08) [18]Kerk © (04.07.05 21:59) [15]
Что ты этим хочешь сказать ? Где объект, у которого Self равен nil ?
← →
Kerk © (2005-07-05 11:37) [19]Игорь Шевченко © (05.07.05 11:08) [18]
Где объект, у которого Self равен nil ?
А объект тут причем?
> Что, разве могут быть случаи, когда Self=nil?
Да. Могут.
← →
Игорь Шевченко © (2005-07-05 11:40) [20]Kerk © (05.07.05 11:37) [19]
> А объект тут причем?
при сабже, дружище, при сабже.
> > Что, разве могут быть случаи, когда Self=nil?
>
> Да. Могут.
Могут. При некорректном коде, например.
← →
Anatoly Podgoretsky © (2005-07-05 11:43) [21]Но объекта то все равно не будет.
← →
Kerk © (2005-07-05 11:44) [22]Игорь Шевченко © (05.07.05 11:40) [20]
> А объект тут причем?
при сабже, дружище, при сабже.
В сабже сама постановка вопроса имхо некорректна. Нету у объектов никаких Self. Self есть у методов, как один из параметров. И он может быть nil.
← →
Игорь Шевченко © (2005-07-05 11:48) [23]
> Нету у объектов никаких Self. Self есть у методов, как
> один из параметров. И он может быть nil.
Так так-таки, стало быть, и нету ? (с)
← →
Kerk © (2005-07-05 11:53) [24]Игорь Шевченко © (05.07.05 11:48) [23]
TObject.Self ?
← →
isasa © (2005-07-05 12:03) [25]Цитата из help
Methods use the same calling conventions as ordinary procedures and functions,
except that every method has an additional implicit parameter Self,
which is a reference to the instance or class in which the method is called.
The Self parameter is passed as a 32-bit pointer.
Under the register convention, Self behaves as if it were declared before all other parameters.
It is therefore always passed in the EAX register.
Under the pascal convention,
Self behaves as if it were declared after all other parameters
(including the additional var parameter sometimes passed for a function result).
It is therefore pushed last, ending up at a lower address than all other parameters.
Under the cdecl, stdcall, and safecall conventions,
Self behaves as if it were declared before all other parameters, but after the additional
var parameter (if any) passed for a function result.
It is therefore the last to be pushed, except for the additional var parameter.
← →
Игорь Шевченко © (2005-07-05 12:05) [26]Kerk © (05.07.05 11:53) [24]
> TObject.Self ?
TObject
← →
Kerk © (2005-07-05 12:08) [27]Игорь Шевченко © (05.07.05 12:05) [26]
Подмена понятий.
← →
Anatoly Podgoretsky © (2005-07-05 12:23) [28]Чего спорить то, вопрос четко поставлен "Бывают ли объекты с self=nil?", таких не бывает даже с другими вариантами, поскольку Self всего лишь неявный параметр метода и не может быть применено к объекту. Даже если смотреть с точки зрения параметров, но таких объектов в природе не существует.
Остальное только от желания потрепаться.
← →
Kerk © (2005-07-05 12:26) [29]Anatoly Podgoretsky © (05.07.05 12:23) [28]
поскольку Self всего лишь неявный параметр метода и не может быть применено к объекту.
о! :)
Страницы: 1 вся ветка
Форум: "Основная";
Текущий архив: 2005.07.25;
Скачать: [xml.tar.bz2];
Память: 0.51 MB
Время: 0.012 c