小编Ren*_*ann的帖子

在强者退出之后,为什么我的弱参考不被清除?

我有点顽固,但我想了解弱弱和强烈的参考,所以这就是为什么我再次问你.

考虑一下:

__weak NSString* mySecondPointer = myText;   
NSLog(@"myText: %@", myText);
Run Code Online (Sandbox Code Playgroud)

结果是myText: (null)非常明显的 - 弱引用在赋值后设置为null,因为没有对尖头对象的强引用.

但在这种情况下:

__strong NSString* strongPtr = [[NSString alloc] initWithFormat:@"mYTeSTteXt %d"]; 
// weak pointer points to the same object as strongPtr
__weak NSString* weakPtr = strongPtr;
if(strongPtr == weakPtr) 
     NSLog(@"They are pointing to the same obj");        
NSLog(@"StrongPtr: %@", strongPtr);
NSLog(@"weakPtr: %@", weakPtr);

NSLog(@"Setting myText to different obj or nil");

// after line below, there is no strong referecene to the created object:
strongPtr = [[NSString alloc] …
Run Code Online (Sandbox Code Playgroud)

weak-references reference-counting objective-c strong-references

28
推荐指数
1
解决办法
3065
查看次数

STL类用于引用计数指针?

这应该是微不足道的,但我似乎无法找到它(除非不存在这样的类!)

什么是智能指针的STL类(或类集)?

UPDATE

感谢您的回复,
我必须说我很惊讶没有标准的实施.

我最终使用了这个:http://archive.gamedev.net/reference/articles/article1060.asp

c++ stl smart-pointers reference-counting

12
推荐指数
2
解决办法
8253
查看次数

Delphi数据类型太大:柏林更新2中超过2 GB

我有一个适用于Delphi和Lazarus的单元.在Lazarus中,该单元编译时没有任何异常,但在Delphi中它给出了错误数据类型太大:超过2 GB.以下是代码:

unit UType;

{$ifdef FPC}
 {$MODE delphi}{$H+}
{$endif}

interface


type
  TFreqType = Extended;

  TFreqCutArray = Array [0..0]of TFreqType;

  PFreqCutArray = ^TFreqCutArray;

  FilterOrder = Integer;

  TAS_Sample = Extended;

  TAS_SampleArray = Array[0..High(Integer) div Sizeof(TAS_Sample) - 1] of TAS_Sample;

  PTAS_SampleArray = ^TAS_SampleArray;

  TAS_Float = Extended;

  TComplex = record
    Re, Im: TAS_Sample; // Z = Re + i*Im
    end;

  PComplex = ^TComplex;
  TComplexArray = Array[0..High(Integer) div Sizeof(TComplex) - 1] of TComplex;//here Delphi gives the error

  PComplexArray = ^TComplexArray;
  FilterProc = function(V: TAS_Sample): TAS_Sample …
Run Code Online (Sandbox Code Playgroud)

delphi freepascal lazarus delphi-10.1-berlin

9
推荐指数
1
解决办法
475
查看次数

将文字字符串分配给带有"="的NSString实际上做了什么?

以下行实际上做了什么?

string = @"Some text";
Run Code Online (Sandbox Code Playgroud)

假设在字段中声明了"string":

NSString *string;
Run Code Online (Sandbox Code Playgroud)

"="实际上在这里做了什么?它对"字符串"的引用计数有什么作用?特别是,假设由于某种原因"字符串"没有另外分配,是否需要释放?

谢谢!

cocoa reference-counting objective-c variable-assignment string-literals

8
推荐指数
1
解决办法
5127
查看次数

为什么TObject.AfterConstruction和BeforeConstruction具有公众可见性?

如今,一个很简单的问题来到我的脑海里,当我不得不重写TObjectBeforeConstruction方法:

为什么TObject方法AfterConstructionBeforeConstructionpublic知名度?

我希望他们是protected.他们不是的原因是什么?

我无法想象调用AfterConstructionBeforeConstruction不调用该类的构造函数或析构函数的有效目的.你呢?

delphi tobject delphi-xe4

8
推荐指数
1
解决办法
580
查看次数

Delphi DLL是否预定用于加载程序锁?

有一个DLL,由主(桌面)应用程序动态加载Windows.LoadLibrary.那是因为有很多类似的DLL,并且只需要在运行时加载很少的单个DLL.因此静态链接不是一种选择.

问题是,在加载其中一个DLL时,主应用程序每隔一段时间就会挂起.请注意,问题很可能发生在每一个问题上.可能是因为他们有很多共同的代码库.

问题似乎是装载机锁定(请参阅此SO答案).我发现了一张共同的代码,即在所使用的由所有的DLL在启动时begin...end所述的-section library-单元(即project.dpr),其中GetModuleHandleGetProcAddress使用.

我发现,这是一个完全没有DLL的东西,因为begin...endDLL的项目文件的部分实际上是库的DllMain函数,并且调用这样的函数会导致死锁(命名加载器锁).我在本微软最佳实践指南中读到了这一点.

所以我重建了我的代码,这些调用稍后在调用Windows.LoadLibrary完成后调用.

不幸的是,悬挂问题仍然存在.:-(

然后我运行调试器,逐步完成在执行一行代码之前调用的每个初始化.我确定,许多第三方代码违反了DLL初始化代码中要做什么和不做什么的指南:

  • TMS组件包
  • JEDI组件库
  • OmniThreadLibrary
  • Indy组件

所有上述动态加载其他DLL在initialization代码或请求过程指针通过GetProcAddress.我认为这些调用导致我的DLL加载时挂起.

是的,只有少数Delphi开发人员知道危险initialization吗?我该怎么办?

delphi dll dynamic-linking

7
推荐指数
1
解决办法
725
查看次数

气流:排队但未运行的任务

我是气流新手并试图设置气流来运行ETL管道.我能够安装

  1. 空气流动
  2. Postgres的
  3. 芹菜
  4. 的RabbitMQ

我能够测试运行turtorial dag.当我尝试安排作业时,调度程序能够获取它并将我可以在UI上看到的作业排队,但任务没有运行.有人可以帮我解决这个问题吗?我相信我在这里缺少最基本的气流概念.下面是airflow.cfg

这是我的配置文件:

[core]

airflow_home = /root/airflow

dags_folder = /root/airflow/dags

base_log_folder = /root/airflow/logs

executor = CeleryExecutor

sql_alchemy_conn = postgresql+psycopg2://xxxx.amazonaws.com:5432/airflow

api_client = airflow.api.client.local_client


[webserver]


web_server_host = 0.0.0.0

web_server_port = 8080

web_server_worker_timeout = 120

worker_refresh_batch_size = 1

worker_refresh_interval = 30

[celery]

celery_app_name = airflow.executors.celery_executor

celeryd_concurrency = 16

worker_log_server_port = 8793

broker_url = amqp://rabbit:rabbit@x.x.x.x/rabbitmq_vhost

celery_result_backend = db+postgresql+psycopg2://postgres:airflow@xxx.amazonaws.com:5432/airflow


flower_host = 0.0.0.0

flower_port = 5555

default_queue = default
Run Code Online (Sandbox Code Playgroud)

DAG:这是我使用的教程dag

我的dag的开始日期是 - 'start_date':datetime(2017,4,11),

postgresql rabbitmq celery airflow airbnb-js-styleguide

6
推荐指数
1
解决办法
9304
查看次数

当从TOleContainer中提取文档数据时,`DoVerb(ovInplaceActivate)`崩溃并出现各种错误消息

当通过OLE处理Office文档时,一位客户使用我们的软件会遇到一些奇怪的行为.当某个派生TOleContainer类的实例尝试通过DoVerb(ovInPlaceActivate)调用激活OLE对象时,代码崩溃.

有各种错误消息,包括:

  • (0x80030002) 找不到%1.
  • (0x80030005) 访问被拒绝.
  • (0x800706BE) 远程过程调用失败.

看我的代码:

function TfrmOleOffice.SaveToStream: TStream;
var
  LOleContainerState: TObjectState;
  LModified: Boolean;
begin
  Result := TMemoryStream.Create;
  if IsEmpty and OleOfficeAvailable then exit;

  if OleOfficeAvailable then
  begin
    LOleContainerStateBefore := FOleContainer.State;

    LModified := FOleContainer.Modified; // 'FOleContainer.Modified' could be changed by 'FOleContainer.Close'
    FOleContainer.Close;
    FValue.Position := 0;
    if LModified then // otherwise, take stored 'FValue' (see below)
      FOleContainer.SaveToStream(FValue);
    if LOleContainerStateBefore in [osUIActive] then
      ActivateContainer; // reactivate the container
  end;
  Result.CopyFrom(FValue, 0);
end;


//---------------------------------------------------


procedure THKSOleContainer.SaveToStream(Stream: …
Run Code Online (Sandbox Code Playgroud)

delphi excel ole excel-2010

5
推荐指数
1
解决办法
265
查看次数

如何在Windows 10平板电脑模式下强制delphi表单处于前台

这是设置:

我有两个视图在两个不同的vcl表单中实现.对于其中一个我应用了一种风格,使它看起来像一个触摸优化的地铁应用程序.可以根据应用程序的设置切换这些表单.(显示触摸优化视图开/关)

这工作得很好.我重写Application.MainForm,旧表单关闭,新表单出现(并获得焦点).

我希望在Windows 10中实现自动化.作为附加视图模式,我提供了一个"自动检测"选项:

  1. 我正在收听Windows消息WM_SETTINGCHANGE.这是通过在桌面模式和平板电脑模式之间切换发送的.
  2. 然后我检查注册表的值 HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\ImmersiveShell\TabletMode
  3. 如果是1,我切换到触摸优化视图.

这就是问题所在:

旧表单被销毁,弹出新表单并Application.MainForm引用新表单.之后,平板电脑模式的开始屏幕弹出并显示在所有窗口的最顶部.因此,我的新触控优化形式在此屏幕后消失并失去焦点.如果我将视图固定到桌面视图并将窗口10切换到平板电脑模式,则不会出现此行为.在这种情况下,我的应用程序保持焦点并最大化自身(这样就不会创建任何形式).

到目前为止我尝试过的:

  1. 最明显的方法是召唤. Application.MainForm.BringToFront这不起作用.
  2. 我的第二种方法是创建一个隐藏的"辅助形式" FormStyle := fsStayOnTop(需要重点关注)和SetForeground(Application.MainForm.Handle)来自WinAPI的调用.

有任何想法吗?

forms delphi vcl vcl-styles windows-10

5
推荐指数
0
解决办法
1392
查看次数

如何在泛型类中声明枚举类型的集合类型

我在Delphi XE4中遇到了一些奇怪的行为.

我不能set在泛型类中声明一个类型,其中序数类型在同一个类中声明.

例如:

TTest<T> = class(TObject)
type
  TEnumType  = (eOne, eTwo, eThree);
  TEnumTypes = set of TEnumType;
end;
Run Code Online (Sandbox Code Playgroud)

以上不编译.编译器发出错误" E2001:Ordinal type required ".

一个非泛型的类

TTest = class(TObject)
type
  TEnumType  = (eOne, eTwo, eThree);
  TEnumTypes = set of TEnumType;
end;
Run Code Online (Sandbox Code Playgroud)

编译.

要使泛型类成功编译,必须在类外声明序数类型:

TEnumType  = (eOne, eTwo, eThree);
TTest<T> = class(TObject)
type
  TEnumTypes = set of TEnumType;
end;
Run Code Online (Sandbox Code Playgroud)
  1. 这种行为是否被视为错误?如果是,是否已在更高版本中修复?
  2. 有没有人有另一种解决方法?我想在类中声明类型,因为它们仅在此类的私有部分中使用.

delphi generics delphi-xe4

5
推荐指数
2
解决办法
587
查看次数