我一直认为不能在类别中声明对象属性.直到我的合作伙伴在我们的应用程序代码中完成它,它似乎工作.
我继续SO和谷歌狂热试图向他解释不,Objective-C类别只能用于添加方法,而不是属性.我发现了诸如以下问题:
但后来我在Apple的网站上发现了这个链接,其中包含有关@property声明的以下内容:
属性声明以关键字@property开头.@property可以出现在类的@interface中找到的方法声明列表中的任何位置.@property 也可以出现在协议或类别的声明中.(重点补充)
我知道这不起作用:
@interface MyClass ()
NSInteger foobar;
- (void) someCategorizedMethod;
@end
Run Code Online (Sandbox Code Playgroud)
但这编译:
@interface MyClass ()
@property NSInteger foobar;
- (void) someCategorizedMethod;
@end
Run Code Online (Sandbox Code Playgroud)
我的问题是(a)这里的最佳做法是什么?(b)这是Objective-C 2.0的新功能,而不是使用"真正的"iVar,它只是在幕后使用关联存储来实现这个功能吗?
我搜索了很多关于ObjC访问器和合成访问器的问题都无济于事.这个问题更像是"帮我解决问题"的问题; 我不期待一个答案,但我宁愿寻找专家来衡量这个论点.
在Cocoa Touch类中,我会写一些像这样的代码(其中soundEffects是一个合成的NSArray属性):
id foo = [self.soundEffects objectAtIndex:1];
Run Code Online (Sandbox Code Playgroud)
一位同事让我解释为什么上述内容比这一行更好:
id foo = [soundEffects objectAtIndex:1];
Run Code Online (Sandbox Code Playgroud)
好吧,功能上,它没有什么不同.
我对前者的论点如下:
self.soundEffects 告诉处理代码的所有其他编码人员,这是一个iVar,而不是本地范围的变量.
如果我们需要,我们可以在soundEffectsgetter访问器中放置自定义逻辑.
没有具体的理由,在Obj-C工作一年后,它"感觉"是正确的做法.
他接受参数#1和#2是有效的,但也给出了对应点:
这不仅仅是代码臃肿吗?
一个类不应该被允许直接与自己的iVars交谈,而不必自己调用方法(getter)吗?
任何接受者?
出于某种原因,我不能让UIWebView与我的新Retina图像"玩得很好".这个问题,一步一步:
我正在从包中加载一系列HTML帮助文件.我的代码加载不同的HTML文件,如果它是iPhone 4(LWERetinaUtils下面是我写的一个util类).我已经读过这个问题,UIWebView不可能自动检测@ 2x指标 - 并亲自体验,因此这种方法.
if ([LWERetinaUtils isRetinaDisplay])
htmls = [NSArray arrayWithObjects:@"foo@2x.html",@"bar@2x.html",nil];
else
htmls = [NSArray arrayWithObjects:@"foo.html",@"bar.html",nil];
Run Code Online (Sandbox Code Playgroud)
foo@2x.html和的内容之间的唯一区别foo.html是图像标签指的是更高分辨率的图像.
然后,我像这样加载我的UIWebView:
_webView = [[UIWebView alloc] initWithFrame:CGRectMake(0.0f, 0.0f, 320.0f, 375.0f)];
_webView.delegate = self;
[self _loadPageWithBundleFilename:self.filename];
[self.view addSubview:_webView];
Run Code Online (Sandbox Code Playgroud)
_loadPageWithBundleFilename: 我写的只是一个帮助方法,告诉UIWebView加载文件中的内容.
到目前为止,我的内容在iPhone模拟器和iPhone 4模拟器之间的加载方式不同 - 而不是我的期望.
文本显示完全相同的大小 - 但Retina图像似乎按比例放大(它们看起来像素化),它们飞离屏幕的右端.
我试过了:
_webView.scalesPageToFit = YES
Run Code Online (Sandbox Code Playgroud)
属性,当然,它使图像显得恰到好处(至少没有像素化).但是,那时我的文字很小(因为我的网页视图已经缩小了很多).
有谁知道如何解决这类问题?我已经看过一些Javascript解决方案(像这样),但它们似乎只是"图像交换",这是我上面已经做过的 - 所以它应该工作,不是吗?
最后,在HTML文件中,这是我引用图像的方式:
<img src="welcome@2x.png" border="0" title="Welcome!" class="title"/>
Run Code Online (Sandbox Code Playgroud)
而CSS:
body{ margin:20pt; padding:10pt; line-height:38pt; font-size:24pt; text-align:left; background-color: transparent; font-family:Helvetica,sanserif; width:640pt;}
Run Code Online (Sandbox Code Playgroud)
我把宽度标签放在CSS中 - …
我想知道如何在Heroku工作者dyno上的进程之间进行通信.
我们希望Resque工作者读取队列并将数据发送到在同一个dyno上运行的另一个进程."其他进程"是一种现成的软件,通常使用TCP套接字(端口xyz)来监听命令.它设置为在Resque工作程序启动之前作为后台进程运行.
但是,当我们尝试本地连接到该TCP套接字时,我们无处可去.
我们设置队列的Rake任务执行此操作:
task "resque:setup" do
# First launch our listener process in the background
`./some_process_that_listens_on_port_12345 &`
# Now get our queue worker ready, set up Redis backing store
port = 12345
ENV['QUEUE'] = '*'
ENV['PORT'] = port.to_s
Resque.redis = ENV['REDISTOGO_URL']
# Start working from the queue
WorkerClass.enqueue
end
Run Code Online (Sandbox Code Playgroud)
这样做 - 我们的侦听器进程运行,Resque尝试处理排队的任务.但是,Resque作业失败,因为它们无法连接localhost:12345(具体而言Errno::ECONNREFUSED).
可能,Heroku在同一个dyno上阻止TCP套接字通信.有没有解决的办法?
我尝试从情境中取出"代码"并在命令行上执行(在服务器进程声称它已正确绑定到12345之后):
nc localhost 12345 -w 1 </dev/null
Run Code Online (Sandbox Code Playgroud)
但这也没有联系.
我们目前正在调查更改客户端/服务器代码以便UNIXSocket在两侧使用而不是TCPSocket,但由于它是一个现成的软件,我们宁愿避免使用我们自己的分支.
我的iOS应用会显示不同的货币(美元,日元,澳元,欧元)在不同的本地化(en_US,en_AU,ja_JP等).
对于日语区域/语言(两者都在我的设备上设置),如果我有:
NSNumberFormatter *fmt = [[NSNumberFormatter alloc] init];
fmt.numberStyle = NSNumberFormatterCurrencyStyle;
fmt.currencyCode = @"JPY";
NSString *labelText = [fmt stringFromNumber:@1000000];
Run Code Online (Sandbox Code Playgroud)
我的标签文字是¥1,000,000.但是,在日文和中文中,可能会写入大于10,000的数字100??,这是我想要的输出.
知道我可以写什么代码100??作为输出吗?
我想避免我的代码中的逻辑块检查locale/region,但我觉得这就是我要反对的东西(例如,使用方法调用fmt.multipler = @(1/10000)将1,000,000除以10,000以获得正确的值).
用例:我将UIView子类化为创建一个自定义视图,该视图使用圆角矩形"遮罩"UIImage(将图像剪切为圆角矩形).代码正在运行; 我使用了类似这个问题的方法.
但是,我想要剪切剪切路径以创建"框架".这是有效的,但弧形笔划看起来与线条笔划明显不同.我已经尝试将笔划宽度调整到更大的值(我认为它最初是像素化),但抗锯齿似乎处理弧和线不同.
这是我在模拟器上看到的内容:

这是绘制它的代码:
CGContextSetRGBStrokeColor(context, 0, 0, 0, STROKE_OPACITY);
CGContextSetLineWidth(context, 2.0f);
CGContextAddPath(context, roundRectPath);
CGContextStrokePath(context);
Run Code Online (Sandbox Code Playgroud)
有谁知道如何顺利排队?
我们正在开发一个关于Ruby 1.9.3和Rails 3.2.1的应用程序.
最近,我们的单元测试在开始时变得迟钝.调用和执行需要大约15秒.一旦我看到"执行测试:单位",在看到任何输出之前还需要10秒钟.最后,任务完成,测试只需3秒即可自行执行.
可以接受3秒的单元测试.对于BDD/TDD,25秒加载时间是不现实的.
这是我跑步时会发生的事情rake test:units --trace:
** Invoke test:units (first_time)
** Invoke test:prepare (first_time)
** Invoke db:test:prepare (first_time)
** Invoke db:abort_if_pending_migrations (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute db:abort_if_pending_migrations
** Execute db:test:prepare
** Invoke db:test:load (first_time)
** Invoke db:test:purge (first_time)
** Invoke environment
** Execute db:test:purge
** Execute db:test:load
** Invoke db:test:load_schema (first_time)
** Invoke db:test:purge
** Execute db:test:load_schema
** Invoke db:schema:load (first_time)
** Invoke environment
** Execute db:schema:load
** Execute test:prepare
** …Run Code Online (Sandbox Code Playgroud) 我有一个独立的XULRunner应用程序,以前运行的是XULRunner 1.9.2(旧的,我知道).我刚升级到XULRunner 33.
以前,当我在本地开发(的MacBook Pro与Mac OS X 10.9.5),我会经常Cmd+ Tab我的IDE和我的应用程序之间.
升级后,我不能再这样做了.我的桌面上仍然有一个窗口(如中所定义main.xul),但它不再出现在我的Cmd+ Tab列表中.我必须在桌面上"找到"它.
关闭窗口会退出应用程序等,而且我得到一个应用程序窗口的事实意味着我main.xul是正确的...但我不知道为什么会这样.
<?xml version="1.0"?>
<?xml-stylesheet href="chrome://global/skin/" type="text/css"?>
<?xml-stylesheet href="chrome://my-app-name/skin/css/main.css" type="text/css"?>
<!DOCTYPE window SYSTEM "chrome://my-app-name/locale/main.dtd">
<window id="main" title="&window-title;" width="750" height="530" persist="width,height,screenX,screenY,sizemode" xmlns="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul">
<script><!-- MY APPLICATION CODE HERE --></script>
<keyset>
<key modifiers="accel" key="W" oncommand="window.close()"/>
<key modifiers="accel" key="Q" id="quit"/>
</keyset>
<toolbox>
<menubar>
<menu id="menu_file" label="File" hidden="true">
<menupopup>
<menuitem id="menu_FileQuitItem" key="quit" label="Quit" oncommand="goQuitApplication();"/>
</menupopup>
</menu>
</menubar>
</toolbox>
</window>
Run Code Online (Sandbox Code Playgroud)
我已经阅读了XULRunner教程中的Windows和菜单:
XULRunner …
我刚刚将Postgres json类型添加到正在使用的Rails / Active Record表中。我想用Rails装置中的默认值填充记录:
fixture_id:
existing_column: "foobar"
newly_added_column: <%= JSON.dump({:reason => 'foobar'}) %>
Run Code Online (Sandbox Code Playgroud)
以前,我以这种方式将字符串化的JSON存储在text列中。但是,当我现在运行此单元测试时:
test "my test" do
sut = fixtures(:fixture_id)
assert_not_nil sut.newly_added_column
end
Run Code Online (Sandbox Code Playgroud)
测试失败。因为它在数据库级别是JSON,所以我认为将其转储为字符串不是有用的,但是YAML固定装置似乎无法将对象保留为Hash(当我尝试不使用时JSON.dump,会得到ActiveRecord::Fixture::FormatError: a YAML error occurred parsing)。
请注意,我使用的是Rails 3,因此我认为对此有一些支持,但在Rails 3中,添加jsonPostgres列类型的迁移仍然有效。
我有一个UITableViewController我已指定为UISearchBarDelegate.到目前为止,我已经以编程方式将UISearchBar添加到表的headerView中,并且没有任何问题.
我开始耗尽屏幕空间,所以我决定杀死我的普通UINavigationController标题(这是文本),并添加了以下代码,将我的SearchBar从表移动到UINavigationBar:
// (Called in viewDidLoad)
// Programmatically make UISearchBar
UISearchBar *tmpSearchBar = [[UISearchBar alloc] initWithFrame:CGRectMake(0,0,320,45)];
tmpSearchBar.delegate = self;
tmpSearchBar.showsCancelButton = YES;
tmpSearchBar.autocorrectionType = UITextAutocorrectionTypeNo;
tmpSearchBar.autocapitalizationType = UITextAutocapitalizationTypeNone;
[self set_searchBar:tmpSearchBar];
[tmpSearchBar release];
self.navigationItem.titleView = [self _searchBar];
Run Code Online (Sandbox Code Playgroud)
此代码按预期工作 - 我的UINavigationBar现在是一个UISearchBar.但是,我的委托方法:
/** Only show the cancel button when the keyboard is displayed */
- (void) searchBarDidBeginEditing:(UISearchBar*) lclSearchBar
{
lclSearchBar.showsCancelButton = YES;
}
Run Code Online (Sandbox Code Playgroud)
......不再被召唤.我已经确定了,我已经确认UISearchBar的代表确实是自己的视图控制器.奇怪的是,这个委托方法仍被称为正常:
/** Run the search and resign the keyboard */
- (void) searchBarSearchButtonClicked:(UISearchBar *)lclSearchBar
{
_deepSearchRan = NO;
[self runSearchForString:[[self …Run Code Online (Sandbox Code Playgroud) (这个算法适用于我正在开发的 iPhone 应用程序,如果这对上下文有帮助的话。)
我们需要制作UUID来唯一标识一些产品。通常这就像分配唯一编号一样简单,但我们还希望将元数据编码到我们的 UUID 中。我们的 API 只允许使用一个字段,因此我们希望使用 UUID 字段作为唯一标识符和元数据载体。
通常,您可以将数据与下划线混合在一起,但我们有一个要求使这一点变得困难:元数据项之一可以是包含n 个项的列表。
这是元数据:
局限性
我们唯一的技术限制是,我们只能使用最多 128 个字母数字字符 (a-zA-Z0-9),包括下划线、句点和连字符来表示 UUID(它是一个 API)。
用例
以下是一些用例来解释该算法将帮助解决什么问题:
用户购买了产品A和产品B。后来我们发布了产品C,它是产品A+B的组合。通过C的UUID,我们希望我们的应用程序代码能够确定C确实是A+B,并且由于用户已经拥有A+B,所以C不会出现在可用产品列表中。
用户有 2 个设备,A 和 B。设备 B 不支持产品 C,因此当用户在设备 B 上查看产品时,C 不应该对他们可用,而应该在设备 A 上。
到目前为止我所做的
设备类型应该很简单 - 有 16 种离散类型,我可以对其进行位掩码 - 16 位 = 4 个十六进制字符。够简单的。
版本控制是相同的 - 我可以将每个版本段 (xyz) 填充为 2 位数字,然后只需 2 次 6 …
我在Heroku上运行一个实时RoR(Rails 3.21.11)应用程序,其中包含一些我们想要缓存的敏感(个人身份识别)信息(基于每个用户约80kb的JSON).
由于我们在Heroku上运行,我们显然信任Heroku这些数据.但是,要使用memcached,我们需要使用Heroku插件,例如Memcachier.
业务问题:我们不愿意将此敏感信息放在第三方提供商的基础架构上,除非在出路时对称加密.
当然,我可以这样做:
value = encrypt_this(sensitive_value)
Rails.cache.write('key', value)
Run Code Online (Sandbox Code Playgroud)
但我们设想一个未来将存储ActiveRecord对象以及良好的'JSON' - 所以我们需要自动加密每一位数据,我们不想写一条加密线到可能想要使用缓存的每一段代码中.
有没有宝石/项目/工具来做到这一点?
我有一个Rails应用程序,它有2个"客户端" - 一个iOS应用程序读/写JSON,以及读取HTML的Web浏览器.
现在,如果我说"我想为不同的浏览器/客户端提供不同的输出",我们可以使用不同的ERB文件并基于User-Agent或类似地进行渲染.
通过这种方式,Rails在Web世界中被想象 - 我键入"cap deploy",并且我的所有"实例"都升级到最新版本(保存活动会话AJAX调用).
然而,作为iOS开发人员,我非常习惯于if在代码中阻止处理不同的数据版本和客户端应用程序版本.这很痛苦(但需要).
我希望能够说"我会神奇地想到版本1.0中的完美数据结构",但我们可能都知道这不是真的 - 我会随着时间的推移添加和弃用属性甚至模型.
我不想将所有版本控制逻辑与我的普通HTML混合(可以优雅地升级,如上所述),所以我想到了:
我想解决一个解决的问题吗?在进行这个项目时,我应该知道任何资源或指导原则吗?
ios ×3
heroku ×2
iphone ×2
json ×2
macos ×2
objective-c ×2
properties ×2
algorithm ×1
api ×1
caching ×1
categories ×1
currency ×1
getter ×1
image ×1
memcached ×1
postgresql ×1
rake ×1
ruby ×1
setter ×1
sockets ×1
tcp ×1
testunit ×1
uisearchbar ×1
uiwebview ×1
unit-testing ×1
uuid ×1
worker ×1
xulrunner ×1