我想从工作线程发送一个对象回到主线程.但是,自动释放池是否在线程之间工作?以下代码有什么问题:
-(void)mainThreadReceiveResult:(id)response
{
[response retain];
/* Do some stuff with response */
[response release];
}
-(void)workerThreadDoWork
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
response * response = [[[response alloc] init] autorelease];
response->someData = [self getSomeData];
[delegate performSelectorOnMainThread:@selector(receiveResult:) withObject:response waitUntilDone:NO];
[pool release];
}
Run Code Online (Sandbox Code Playgroud)
似乎工作正常.但是[pool release],在主线程能够保留之前,工作线程是否可以到达?
我打算写一些新的UI代码,很多人建议使用RoR.但是从我到目前为止读到的关于RoR的内容来看,似乎几乎必须要有一个数据库来存储后端数据.就我而言,我无法访问数据库,所有数据对象都可通过Web服务(一些REST和SOAP服务)获得.
我认为在这种情况下我必须使用控制器直接与服务通信,但是在没有模型层(ActiveRecord)的情况下使用RoR仍然是个好主意.
是否有任何其他框架更适合这种方法(我可以使用Java或Ruby中的任何东西,我们没有任何PHP或Python代码).
我NSUserDefaults对iPhone 感到困惑.
我来自C/asm背景,Objective-C的东西是学习经验.
我目前正在使用NSUserDefaults存储一些字符串(对于高分表中的名称).我想开始实施"保存游戏"类型功能,这样如果用户接到电话或退出游戏片刻,他们就可以回来了.
为了恢复游戏,我有几个BOOL标志,几个ints来存储一些必要的变量,但我被困在一个我需要存储的数组.
我有一个50元素的unsigned chars 数组.int如果它能让事情变得更容易,我可以将它移动到s,但我只是没有看到它.
为了合作,NSUserDefaults我可以setBool(已经这样做了),setFloat(再次,已经这样做了)setInteger,和setObject.
显然,我可以为数组的每个元素声明键并逐个存储它们,setInteger但这真的很糟糕.解决这个问题的最佳方法是什么?而不是一个unsigned chars 数组,我不知何故尝试使用NSObject?有什么好的教程NSObject我可以阅读以更好地理解它吗?
在svn工作目录中,我可以
在git中有一个等效的命令吗?你能告诉我怎么做吗?
我想用java开始web开发.我不知道如何开始,学习什么,或者学习和使用的最佳Web框架是什么.帮帮我?
我正在使用一些代码,这些代码使用各种回调执行大量异步操作; 使用积木和GCD,Snow Leopard让这非常容易.
我是这样打来NSTask的NSBlockOperation:
[self.queue addOperationWithBlock:^{
NSTask *task = [NSTask new];
NSPipe *newPipe = [NSPipe new];
NSFileHandle *readHandle = [newPipe fileHandleForReading];
NSData *inData = nil;
[task setLaunchPath:path];
[task setArguments:arguments];
[task launch];
while ((inData = [readHandle availableData]) && [inData length]) {
[[NSOperationQueue mainQueue] addOperationWithBlock:^{
// callback
}];
}
[task waitUntilExit];
}];
Run Code Online (Sandbox Code Playgroud)
这种方法非常有效.它就像魔术,只要我的回调正确处理并发.
现在,我希望能够合并其中一些电话; 这是模型对象的"刷新"方法,可能需要很长时间才能完成.让用户敲击刷新按钮不应该占用机器和所有这些.
我可以看到这里的实施困境.我可以创建一大堆队列 - 每个呼叫类型一个 - 并将其并发操作计数设置为1,然后-cancelAllOperations在新呼叫时调用.
或者,我可以对当前正在进行的调用进行更多的手动记录,并为每个模型对象管理单个队列(正如我正在做的那样),或者我可以更进一步使用全局队列.
有多重NSOperationQueue?创建大量队列是一个糟糕的架构决策吗?有没有更好的方法来合并这些任务?
如果我有NSMutableString这样的
NSMutableString *foo = [[NSMutableString alloc] init];
Run Code Online (Sandbox Code Playgroud)
如果我把对象弄清楚了foo = nil,是否会将保留计数降低1,从而有效地释放内存?此时我是否需要从堆中重新分配foo才能使用它?
我认为我的问题最好被描述为一个例子.假设我有一个名为"Thing"的简单模型,它有一些简单数据类型的属性.就像是...
Thing
- foo:string
- goo:string
- bar:int
Run Code Online (Sandbox Code Playgroud)
这并不难.db表将包含三个具有这三个属性的列,我可以使用@ thing.foo或@ thing.bar等访问它们.
但是我试图解决的问题是当"foo"或"goo"不再包含在简单数据类型中时会发生什么?假设foo和goo代表相同类型的对象.也就是说,它们都只是具有不同数据的"Whazit"实例.所以现在Thing可能看起来像这样......
Thing
- bar:int
Run Code Online (Sandbox Code Playgroud)
但现在有一个名为"Whazit"的新模型看起来像这样......
Whazit
- content:string
- value:int
- thing_id:int
Run Code Online (Sandbox Code Playgroud)
到目前为止,这一切都很好.现在这里是我被困住的地方.如果我有@thing,我怎么设置它来引用我的2个Whazit实例的名称(为了记录,"业务规则"是任何Thing总是有2个Whazits)?也就是说,我需要知道我的Whazit是否基本上是foo或goo.显然,我不能在当前的设置中做@ thing.foo,但我认为这是理想的.
我最初的想法是给Whazit添加一个"name"属性,这样我就可以得到与我的@thing相关的Whatzits,然后通过这种方式选择我想要的Whazit.这看起来很难看.
有没有更好的办法?
只是想知道你是否有人在你的Java项目中使用Git或Mercurial,或者Subversion仍然是最受欢迎的选择?我最近一直在关注github.com和bitbucket.org,但由于存储库可能是私有的,我无法得到实际使用情况的良好指示.
objective-c ×5
cocoa ×4
iphone ×3
cocoa-touch ×2
git ×2
java ×2
svn ×2
activerecord ×1
mercurial ×1
nsoperation ×1
ruby ×1
web-services ×1