我创建了一个简单的测试用例,展示了我在一个更大的代码库中注意到的奇怪行为.这个测试用例如下.我依靠STL Map的"[]"运算符来创建指向这种结构的映射中的结构的指针.在下面的测试用例中,线...
TestStruct *thisTestStruct = &testStructMap["test"];
Run Code Online (Sandbox Code Playgroud)
...给我指针(并在地图中创建一个新条目).我注意到的奇怪之处在于,这一行不仅会导致地图中的新条目被创建(因为"[]"运算符),但由于某种原因,它会导致结构体的析构函数被多次调用两次.我显然错过了一些东西 - 非常感谢任何帮助!谢谢!
#include <iostream>
#include <string>
#include <map>
using namespace std;
struct TestStruct;
int main (int argc, char * const argv[]) {
map<string, TestStruct> testStructMap;
std::cout << "Marker One\n";
//why does this line cause "~TestStruct()" to be invoked twice?
TestStruct *thisTestStruct = &testStructMap["test"];
std::cout << "Marker Two\n";
return 0;
}
struct TestStruct{
TestStruct(){
std::cout << "TestStruct Constructor!\n";
}
~TestStruct(){
std::cout << "TestStruct Destructor!\n";
}
};
Run Code Online (Sandbox Code Playgroud)
上面的代码输出以下内容......
/*
Marker One
TestStruct Constructor! //makes sense …Run Code Online (Sandbox Code Playgroud) 我正在尝试使用以下方法从本地URL加载图像:
UIImage *image = [UIImage imageWithData:[NSData dataWithContentsOfURL:fileURL]];
[self.imageView setImage:image];
NSLog(@"imageView set");
Run Code Online (Sandbox Code Playgroud)
所以我几乎立即在控制台"imageView set"中看到它,但它需要很长时间才能在UI中反映出来(有时几分钟!).
知道为什么会这样吗?
从阅读c ++ 11草案的修订版N3242开始,标准库接口的某些组件(特别是线程和锁定)似乎依赖于异常处理.
由于我在禁用异常时做了很多工作,我想知道哪些库组件/功能(实际上或逻辑上)不可用而没有启用异常处理?
所以我今天在接受采访时被问到这个问题,经过一些谷歌搜索仍然无法找到答案(事实上我甚至找不到任何使用[NSString string]方法的代码).
有什么区别
NSString *someString = [NSString string];NSString *someString = [[NSString alloc] init];现在我最初的想法是[NSString string]返回一个自动释放的对象,而使用alloc和init将返回一个已保留的对象.然而,似乎这个答案是不正确的.
我查看了苹果文档中的NSString类引用,但它说的只是
Returns an empty string.
+ (id)string
Return Value
An empty string.
Run Code Online (Sandbox Code Playgroud)
有人可以向我解释这两者之间究竟有什么区别吗?
我有两个协议
@protocol P1
-(void) printP1;
-(void) printCommon;
@end
@protocol P2
-(void) printP2;
-(void) printCommon;
@end
Run Code Online (Sandbox Code Playgroud)
现在,我在一个类中实现这两个协议
@interface TestProtocolImplementation : NSObject <P1,P2>
{
}
@end
Run Code Online (Sandbox Code Playgroud)
如何为"printCommon"编写方法实现.当我尝试执行时,我有编译时错误.
是否有可能为"printCommon"编写方法实现.
当有问题的getter返回引用时访问成员变量有多贵?
例如,如果你有一个需要经常使用这种访问器的类,那么将所述引用存储在需要使用它的类中并简单地初始化一次会有多高效?
以NSObject方法-(id)awakeAfterUsingCoder:(NSCoder *)decoder为例,文档说:
允许对象在解码后替换另一个对象.例如,表示字体的对象在解码时可以释放自身并返回具有与其自身相同的字体描述的现有对象.通过这种方式,可以消除冗余对象.
通常你会这样做
[self release];
return substitutedObject;
Run Code Online (Sandbox Code Playgroud)
使用ARC,你必须离开这条线.这不会泄漏吗?或者我应该只相信NSCoder对象为我发布原始对象?如果是这样,为什么你必须首先用非ARC代码明确释放自己?
self = nil根据编译器文档中关于self的内容,我认为不正确:http://clang.llvm.org/docs/AutomaticReferenceCounting.html#misc.self
memory-management objective-c nscoder automatic-ref-counting
我遇到了这个_cmd伎俩:
-(void)methodToBeRunOnMainThreadWithObj:(id)object {
if (![NSThread isMainThread) {
[self performSelectorOnMainThread:_cmd withObject:object]
} else {
// ... method body
}
}
Run Code Online (Sandbox Code Playgroud)
这是确保在主线程上执行方法的可靠方法吗?
我已经读过墙上的文字,避免全球.这导致了一个明显的问题,如何最好地做到这一点?
我显然想用当前的项目来做.目标是让远程PC向已经拥有stdin阅读器的应用程序发送"击键".我们的想法是让现有的代码检测到没有待处理的按键,然后检查是否有"udp按键",如果是,则将其填入所以它似乎是键盘输入.微创,不需要在其他人的代码中改装.
所以我拼凑了一个使用小UDP套接字读写setup()函数打开并绑定端口,那么service()在使用非阻塞循环功能select()一次,没有循环,只是检查是否有任何阅读现在.如果是这样,请从套接字读取数据并对其执行某些操作,否则返回0.
// pseudo c
char c;
setup();
while (1)
{
c = check_for_keyboard_entry();
if ( c == 0 )
c = service();
handle_keypress( c );
do_a_bunch_of_other_stuff();
}
Run Code Online (Sandbox Code Playgroud)
显而易见的方法是使用一些全局变量来传输两个函数之间的端口,超时,sockaddr等.但是,你应该使用全局,对吗?
那么在函数之间传递六个或八个变量的首选方法是什么?
如果我要使用静态变量setup(),它们是否可以通过service()例程访问?
我想一个获得malloc-ed并传递的结构会起作用.我应该有一个cleanup()关闭套接字并释放内存.
记住,这是AC问题.没有C++!
Xcode 4.2中存在一个问题,Xcode将在我的启动驱动器中填充数十GB的preamble.pch-******文件/private/var/folders/.
有人知道如何防止这种情况发生吗?
这意味着我必须每隔几个小时手动清空这些文件(必要时退出/重新启动Xcode),以防止我的启动驱动器填满.如果可能的话,我(可能)宁愿恢复原来的行为而不是创建一些脚本或程序来每小时系统地删除它们.
其他:
谢谢