小编Sam*_*Sam的帖子

为什么EAAccessoryDidConnectNotification会发生两次?

我有一个课程来管理来自和外部附件到iPad的消息.在init中我有以下代码:

- (id) init
{
    self = [super init];
    if (!self) return;

    [[EAAccessoryManager sharedAccessoryManager] registerForLocalNotifications];    //we want to hear about accessories connecting and disconnecting
    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(accessoryDidConnect:)
                                                 name:EAAccessoryDidConnectNotification
                                               object:nil];

    [[NSNotificationCenter defaultCenter] addObserver:self
                                             selector:@selector(accessoryDidDisconnect:)
                                                 name:EAAccessoryDidDisconnectNotification
                                               object:nil];
    ...
}
Run Code Online (Sandbox Code Playgroud)

在dealloc我有

- (void) dealloc
{
    [[NSNotificationCenter defaultCenter] removeObserver:self name:EAAccessoryDidDisconnectNotification object:nil];
    [[NSNotificationCenter defaultCenter] removeObserver:self name:EAAccessoryDidConnectNotification object:nil];
    [[EAAccessoryManager sharedAccessoryManager] unregisterForLocalNotifications];    
}
Run Code Online (Sandbox Code Playgroud)

出于某种原因,当我将外部附件连接到iPad时,accessoryDidConnect:会触发一个accessoryDidDisconnect:随后是accessoryDidConnect:

我无法弄清楚为什么我会得到额外的连接和断开连接.有任何想法吗?

accessory nsnotificationcenter ipad ios

7
推荐指数
2
解决办法
4136
查看次数

IBOutlet Work的readonly属性是否优先?

在我继承的代码中,我看到了以下内容:

@property (readonly) IBOutlet UIImageView * bgImage;
Run Code Online (Sandbox Code Playgroud)

当我期望保留记忆模型如:

@property (readonly, retain) IBOutlet UIImageView * bgImage;
Run Code Online (Sandbox Code Playgroud)

我很困惑为什么第一个属性定义工作而不会引起问题.

此外,还有一个releasedealloc,如你所料:

-(void)dealloc
{
   [_bgImage release];
   [super dealloc];
}
Run Code Online (Sandbox Code Playgroud)

如果有人能为此提出解释,我将不胜感激.我已经与原始开发人员交谈,他试图编写更简洁的代码,这就是为什么他retain在内存模型中遗漏了(似乎没必要).

我想知道IBOutlet是否基本上被视为ivar IBOutlet语句,因为它只是readonly(没有使用setter,因此默认的assign memory模型没有区别).

如果永远不会期望IBOutlet发生变化,那么使用没有内存模型的readonly属性实际上是定义属性的更好方法吗?

cocoa-touch memory-management objective-c iboutlet

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

EASession Leaks

我有一个连接到附件的应用程序,当我断开附件时,我创建的EASession是为了与附件通信泄漏.

当附件连接时,我收到通知,并检查EAAccessoryManager的附件集合,以查找具有使用某种协议的特定名称的附件.当我发现这个时,我使用代码为该附件创建了一个EASession对象:

-(void) openSession
{
   ...  // finds accessory object

   if (accessory)
   {
      [self closeSession];
      session = [EASession alloc];
      NSLog(@"alloc :: session retainCount: %i", session.retainCount);
      [session initWithAccessory:accessory forProtocol:SmokeSignalsProtocolName]; 
      NSLog(@"init  :: session retainCount: %i", session.retainCount);

      [[session inputStream] open]; 
      [[session outputStream] open]; 

      ... // other logic (pump run loop, etc..)
   }
}

-(void) closeSession
{
    if (session)
    {
       [[session inputStream] close]; 
       [[session outputStream] close]; 
       [session release], session = nil;
    }
}
Run Code Online (Sandbox Code Playgroud)

通常我在一行上有alloc和init,但我发现(将其分离出来)是alloc给出了+1保留计数(正如你所期望的那样)但是iniWithAccessory:forProtocol:给它+3保留计数当我只会期望来自init方法的+2 retainCount.

泄漏仪器似乎也支持这一点:

在此输入图像描述

一步一步看看泄漏仪器:

  1. +1保留计数:: [???Accessory openSession] …

memory-leaks external-accessory ios eaaccessory

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

SEO URL重写ASP.NET

我已经有了一个ASP.NET网站

我想改变我的网站更多SEO网址友好.

我想改变前.这个网站:www.mydomain.aspx?articleID = 5

to:www.mydomain/article/learningURLrewrite - 需要从DB读取文章名称

我该如何做到这一点?

我已经尝试过谷歌的一些文章,提到IhttpModule没有任何运气.

我的目标是让一个类负责基于folderpath重定向(如下所示):

string folderpath = "my folderpath" (could be articles, products etc.)
string id = Request.QueryString["id"].ToString();

if(folderpath.equals("articles"))
{
   string name = //find name from id in DB
   //redirect user to www.mydomain/article/name 
}

if(folderpath.equals("products"))
{
   string name = //find name from id in DB
   //redirect user to www.mydomain/products/name 
}
Run Code Online (Sandbox Code Playgroud)

另外我想删除aspx扩展名

asp.net seo url-rewriting

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

对多个端点使用 HttpClient 和 HttpClientHandler 的最佳实践是什么?

使用HttpClient并不像我希望的那么简单。尽管它是一种IDisposable类型,但将其包装在声明中并不是最佳实践using,甚至将其设置为单例也是理想的选择。HttpClientHandler但是,当您将 a 传递给类似的构造函数时会怎么样HttpClient

using (var client = new HttpClient(singletonHttpClientHandler, false);
Run Code Online (Sandbox Code Playgroud)

我见过像上面这样的代码,其中HttpClient故意将 包裹在using语句中,但HttpClientHandler是单例。文档表明客户端处理程序已被处理,除非第二个参数指示false如上面所做的那样:

在此输入图像描述

请参阅https://learn.microsoft.com/en-us/dotnet/api/system.net.http.httpclient?view=netframework-4.8#constructors

使用 HttpClient 的部分问题是一些事情,比如超时必须与该 HttpClient 的所有实例共享,因此出于这个原因,最好创建使用 HttpClientHandler 提供的相同连接池的单独的 HttpClient 实例(假设这就是它的工作原理)。我担心的是,我不希望 HttpClient 创建一个连接池,然后每次都会将其释放。有很多帖子讨论了这对性能有何影响。我似乎找不到任何关于有效使用 HttpClient 和 HttpClientHandlers 的好的文档。

所以...我的问题基本上是:

当一起使用 HttpClient 和 HttpClientHandler 时,是否最好将 HttpClientHandler 设为单例,然后using每次在块中实例化尽可能多的新 HttpClient?-- 这又只有当连接池由 HttpClientHandler 管理时才有意义,我认为就是这种情况。

c# dotnet-httpclient httpclienthandler

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

"s"作为格式说明符做什么?

就是":s"在这种表达string.format("{0:s}", "hello world")只是意味着该变量是一个字符串?我只是不确定为什么有人会这样做.

我在代码中找到了这个,并希望删除它,":s"但希望确保我不会改变行为.

.net c# string-formatting

4
推荐指数
1
解决办法
2215
查看次数

调用内联块指定返回类型和参数

我决定尝试在Objective-C中使用块来控制流,并且遇到了一些内联调用多个块的问题.

我有一个OOBoolean,它是BOOL原语的包装器,并提供以下方法:

+ (id) booleanWithBool: (BOOL) boolPrimitive;

- (id) initWithBool: (BOOL) boolPrimitive;

- (void) ifTrueDo: (void (^) ()) trueBlock 
        ifFalseDo: (void (^) ()) falseBlock;

- (void) ifTrueDo: (void (^) ()) trueBlock;

- (void) ifFalseDo: (void (^) ()) falseBlock;
Run Code Online (Sandbox Code Playgroud)

我这样使用这个类没有问题:

OOBoolean* condition = [OOBoolean booleanWithBool: (1 + 1 == 2)];

id trueBlock = ^(){
    NSLog(@"True.");
};

id falseBlock = ^(){
    NSLog(@"False.");
};

[condition ifTrueDo: trueBlock ifFalseDo: falseBlock];
Run Code Online (Sandbox Code Playgroud)

我得到了"真实"的结果.但是在尝试此操作时我一直遇到语法错误:

OOBoolean* condition = [OOBoolean booleanWithBool: (1 + 1 == 2)];

[condition ifTrueDo:(void (^)()) …
Run Code Online (Sandbox Code Playgroud)

objective-c ios objective-c-blocks

3
推荐指数
1
解决办法
1684
查看次数

如何在添加新项目时自动滚动tableview?

如何在添加新项目时自动滚动tableview?

我尝试使用

- (void)scrollToRowAtIndexPath:(NSIndexPath *)indexPath 
              atScrollPosition:(UITableViewScrollPosition)scrollPosition 
                      animated:(BOOL)animated
Run Code Online (Sandbox Code Playgroud)

但我无法理解.

你能提供样品代码吗?

iphone objective-c uitableview ios4 ios

3
推荐指数
1
解决办法
1695
查看次数

RetainCount可以在这个例子中使用吗?

RetainCount ==坏

retainCount禁忌,不可靠,不可预测,一般不应使用.我不会在我的代码中的任何地方使用它,但我在一个类中看到它,我以一种有趣的方式使用它.

我有一个类运行一个无限运行的线程,直到线程被取消.问题是线程增加了所有者的保留计数,在我的例子中是实例化它的类.所以,即使我已经完成了使用该类,该实例仍然会出现问题,除非管理我的类的人也有智能知道关闭该线程.这是一个解决方案,但这是我在代码中找到的.

- (oneway void)release
{
    // This override allows allows this object to be dealloced 
    // by shutting down the thread when the thread holds the last reference.
    // Otherwise, the object will never be dealloc'd
    if (self.retainCount == 2)
    {
        [self quitDispatchThread];
    }

    [super release];
}
Run Code Online (Sandbox Code Playgroud)

这是一个聪明的解决方案,但我不确定该怎么想.它会覆盖类上的释放并检查保留计数是否为2.换句话说,它会检查线程是否是保持对象存活的唯一因素(因为保留计数将从2减少到1)如果是,则终止线程(quitDispatchThread将阻塞直到线程终止).

所以...

你能依靠retainCount看看它是否是一个?

通常人们会说要保持清醒,retainCount因为你不知道那里是否有一些自动释放.但是,如果retainCount是1,那么我知道只有线程保持活着的事实我不必担心retainCount可能因某些自动释放等而关闭...

这段代码出了什么问题?

我准备删除它,但它实际上似乎是有道理的.其他对象不必知道我的类正在运行一个线程.其他对象可以安全地retainrelease甚至autorelease拥有线程,而不必担心查封了线程,因为它需要自己照顾的对象.

这段代码实际上感觉干净,令我感到惊讶.

编辑:: NSThread正在保留我的对象

我使用NSThread的事实增加了我的对象的保留计数.我的对象是,target并且selector是线程运行的方法.

initWithTarget:选择器:对象:

返回使用给定参数初始化的NSThread对象.

  • (id)initWithTarget:(id)目标选择器:(SEL)选择器对象:(id)参数 …

objective-c nsthread ios retaincount

3
推荐指数
1
解决办法
247
查看次数

目标C中的全球财产

我有这样一种在Constants.h文件中定义的枚举:

typedef enum {
    CalendarTypeMonth = 0,
    CalendarTypeWeek
} CalendarType;
Run Code Online (Sandbox Code Playgroud)

然后在我的视图控制器中,我确定日历类型应该是什么,并以这种方式将其存储在属性中:

@property (nonatomic) CalendarType myCalendarType;
Run Code Online (Sandbox Code Playgroud)

现在我希望项目中的所有类都可以访问日历类型.如何将此属性设置为global/extern,以便所有类都可以读取此内容?

编辑:我知道整个项目将提供枚举的定义.但我感兴趣的是价值myCalendarType.如何在所有类中访问myCalendarType的值?

global-variables objective-c ios

2
推荐指数
1
解决办法
8781
查看次数

C#short null check语法

我最近在Objective C中编写了大量代码,同时还开展了几个C#项目.在这个过程中,我发现我错过了双向的事情.

特别是,当我在C#中编码时,我发现我错过了Objective C的短空检查语法.

为什么在C#中假设您无法使用以下语法检查对象是否为null:

if (maybeNullObject)  // works in Objective C, but not C#   :(
{
   ...
}
Run Code Online (Sandbox Code Playgroud)

我同意这if (maybeNullObject != null)是一个更冗长/更清晰的语法,但是在代码中一直出来但过于冗长的感觉不仅乏味.另外,我相信if (maybeNullObject)大多数开发人员通常都会理解语法(Javascript,Obj C,我假设其他人).

我把它抛出作为一个问题,假设可能有一个特定的原因C#不允许if (maybeNullObject)语法.但我认为编译器可以轻松地将对象表达式(如if (maybeNullObject)自动(或自动))转换为if (maybeNullObject != null).

这个问题的一个很好的参考是一个想法如何成为一个C#语言功能?.

编辑

我建议的短空检查语法只适用于对象.短的空检查不适用于原语和类型bool?.

c# language-design

2
推荐指数
1
解决办法
999
查看次数