我有一个课程来管理来自和外部附件到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:
我无法弄清楚为什么我会得到额外的连接和断开连接.有任何想法吗?
在我继承的代码中,我看到了以下内容:
@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属性实际上是定义属性的更好方法吗?
我有一个连接到附件的应用程序,当我断开附件时,我创建的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.
泄漏仪器似乎也支持这一点:

一步一步看看泄漏仪器:
[???Accessory openSession] …我已经有了一个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扩展名
使用HttpClient并不像我希望的那么简单。尽管它是一种IDisposable类型,但将其包装在声明中并不是最佳实践using,甚至将其设置为单例也是理想的选择。HttpClientHandler但是,当您将 a 传递给类似的构造函数时会怎么样HttpClient:
using (var client = new HttpClient(singletonHttpClientHandler, false);
Run Code Online (Sandbox Code Playgroud)
我见过像上面这样的代码,其中HttpClient故意将 包裹在using语句中,但HttpClientHandler是单例。文档表明客户端处理程序已被处理,除非第二个参数指示false如上面所做的那样:
使用 HttpClient 的部分问题是一些事情,比如超时必须与该 HttpClient 的所有实例共享,因此出于这个原因,最好创建使用 HttpClientHandler 提供的相同连接池的单独的 HttpClient 实例(假设这就是它的工作原理)。我担心的是,我不希望 HttpClient 创建一个连接池,然后每次都会将其释放。有很多帖子讨论了这对性能有何影响。我似乎找不到任何关于有效使用 HttpClient 和 HttpClientHandlers 的好的文档。
所以...我的问题基本上是:
当一起使用 HttpClient 和 HttpClientHandler 时,是否最好将 HttpClientHandler 设为单例,然后using每次在块中实例化尽可能多的新 HttpClient?-- 这又只有当连接池由 HttpClientHandler 管理时才有意义,我认为就是这种情况。
就是":s"在这种表达string.format("{0:s}", "hello world")只是意味着该变量是一个字符串?我只是不确定为什么有人会这样做.
我在代码中找到了这个,并希望删除它,":s"但希望确保我不会改变行为.
我决定尝试在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) 如何在添加新项目时自动滚动tableview?
我尝试使用
- (void)scrollToRowAtIndexPath:(NSIndexPath *)indexPath
atScrollPosition:(UITableViewScrollPosition)scrollPosition
animated:(BOOL)animated
Run Code Online (Sandbox Code Playgroud)
但我无法理解.
你能提供样品代码吗?
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是1,那么我知道只有线程保持活着的事实我不必担心retainCount可能因某些自动释放等而关闭...
我准备删除它,但它实际上似乎是有道理的.其他对象不必知道我的类正在运行一个线程.其他对象可以安全地retain和release甚至autorelease拥有线程,而不必担心查封了线程,因为它需要自己照顾的对象.
这段代码实际上感觉干净,令我感到惊讶.
我使用NSThread的事实增加了我的对象的保留计数.我的对象是,target并且selector是线程运行的方法.
initWithTarget:选择器:对象:
返回使用给定参数初始化的NSThread对象.
- (id)initWithTarget:(id)目标选择器:(SEL)选择器对象:(id)参数 …
我有这样一种在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的值?
我最近在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?.
ios ×6
objective-c ×5
c# ×3
.net ×1
accessory ×1
asp.net ×1
cocoa-touch ×1
eaaccessory ×1
iboutlet ×1
ios4 ×1
ipad ×1
iphone ×1
memory-leaks ×1
nsthread ×1
retaincount ×1
seo ×1
uitableview ×1