小编mak*_*dad的帖子

从什么时候开始在类别中声明Objective-C 2.0属性?

我一直认为不能在类别中声明对象属性.直到我的合作伙伴在我们的应用程序代码中完成它,它似乎工作.

我继续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,它只是在幕后使用关联存储来实现这个功能吗?

properties objective-c categories

14
推荐指数
1
解决办法
3929
查看次数

在iOS上的Objective-C中,使用合成getter时"self.foo"和"foo"之间的(样式)区别是什么?

我搜索了很多关于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)

好吧,功能上,它没有什么不同.

我对前者的论点如下:

  1. self.soundEffects 告诉处理代码的所有其他编码人员,这是一个iVar,而不是本地范围的变量.

  2. 如果我们需要,我们可以在soundEffectsgetter访问器中放置自定义逻辑.

  3. 没有具体的理由,在Obj-C工作一年后,它"感觉"是正确的做法.

他接受参数#1和#2是有效的,但也给出了对应点:

  1. 这不仅仅是代码臃肿吗?

  2. 一个类不应该被允许直接与自己的iVars交谈,而不必自己调用方法(getter)吗?

任何接受者?

getter setter properties objective-c

13
推荐指数
2
解决办法
4668
查看次数

在本地UIWebView中使用Retina图像

出于某种原因,我不能让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中 - …

iphone image uiwebview retina-display

10
推荐指数
2
解决办法
8060
查看次数

Heroku worker dyno上的进程之间的TCP Socket通信

我想知道如何在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,但由于它是一个现成的软件,我们宁愿避免使用我们自己的分支.

ruby sockets tcp heroku worker

10
推荐指数
2
解决办法
3039
查看次数

如何设置NSNumberFormatter使用"万"(日文/中文10,000标记)显示数字?

我的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以获得正确的值).

currency nsnumberformatter ios

10
推荐指数
1
解决办法
1186
查看次数

核心图形笔划宽度在线条和弧线之间是否不一致?

用例:我将UIView子类化为创建一个自定义视图,该视图使用圆角矩形"遮罩"UIImage(将图像剪切为圆角矩形).代码正在运行; 我使用了类似这个问题的方法.

但是,我想要剪切剪切路径以创建"框架".这是有效的,但弧形笔划看起来与线条笔划明显不同.我已经尝试将笔划宽度调整到更大的值(我认为它最初是像素化),但抗锯齿似乎处理弧和线不同.

这是我在模拟器上看到的内容:

不均匀的笔画图像

这是绘制它的代码:

CGContextSetRGBStrokeColor(context, 0, 0, 0, STROKE_OPACITY);
CGContextSetLineWidth(context, 2.0f);
CGContextAddPath(context, roundRectPath);
CGContextStrokePath(context);
Run Code Online (Sandbox Code Playgroud)

有谁知道如何顺利​​排队?

macos core-graphics ios

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

为什么我在Rails 3.2.1上的"rake test:units"的"启动时间"这么慢?

我们正在开发一个关于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)

rake unit-testing testunit ruby-on-rails-3

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

升级到XULRunner 33后,为什么我无法将Cmd-Tab转换为Mac OS X 10.9上的应用程序窗口?

我有一个独立的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 …

macos xulrunner

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

如何将Postgres JSON值放入Rails装置中?

我刚刚将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列类型的迁移仍然有效。

postgresql json ruby-on-rails ruby-on-rails-3

6
推荐指数
3
解决办法
2073
查看次数

用作UINavigationBar titleVIew时未调用UISearchBar委托?

我有一个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 uinavigationbar uisearchbar

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

如何巧妙地将任意元数据编码为 UUID?

(这个算法适用于我正在开发的 iPhone 应用程序,如果这对上下文有帮助的话。)

我们需要制作UUID来唯一标识一些产品。通常这就像分配唯一编号一样简单,但我们还希望将元数据编码到我们的 UUID 中。我们的 API 只允许使用一个字段,因此我们希望使用 UUID 字段作为唯一标识符和元数据载体。

通常,您可以将数据与下划线混合在一起,但我们有一个要求使这一点变得困难:元数据项之一可以是包含n 个项的列表。

这是元数据:

  • 设备类型(~最多 16 种离散类型)
  • 支持的最低操作系统版本(xxx 格式,其中 x 是 0-99 之间的数字)
  • 支持的最低二进制(应用程序)版本(xxx 格式,其中 x 是 0-99 之间的数字)
  • 该产品取代的任何产品(n 个ID 的列表,其格式是此设计问题的一部分)

局限性

我们唯一的技术限制是,我们只能使用最多 128 个字母数字字符 (a-zA-Z0-9),包括下划线、句点和连字符来表示 UUID(它是一个 API)。

用例

以下是一些用例来解释该算法将帮助解决什么问题:

  1. 用户购买了产品A和产品B。后来我们发布了产品C,它是产品A+B的组合。通过C的UUID,我们希望我们的应用程序代码能够确定C确实是A+B,并且由于用户已经拥有A+B,所以C不会出现在可用产品列表中。

  2. 用户有 2 个设备,A 和 B。设备 B 不支持产品 C,因此当用户在设备 B 上查看产品时,C 不应该对他们可用,而应该在设备 A 上。

到目前为止我所做的

设备类型应该很简单 - 有 16 种离散类型,我可以对其进行位掩码 - 16 位 = 4 个十六进制字符。够简单的。

版本控制是相同的 - 我可以将每个版本段 (xyz) 填充为 2 位数字,然后只需 2 次 6 …

algorithm uuid

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

如何在存储到Rails缓存(在Heroku上)之前加密缓存的值?

我在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' - 所以我们需要自动加密一位数据,我们不想写一条加密线到可能想要使用缓存的每一段代码中.

有没有宝石/项目/工具来做到这一点?

memcached caching ruby-on-rails heroku

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

什么是Rails处理不同控制器客户端的方式(Web,iOS API)?

我有一个Rails应用程序,它有2个"客户端" - 一个iOS应用程序读/写JSON,以及读取HTML的Web浏览器.

现在,如果我说"我想为不同的浏览器/客户端提供不同的输出",我们可以使用不同的ERB文件并基于User-Agent或类似地进行渲染.

通过这种方式,Rails在Web世界中被想象 - 我键入"cap deploy",并且我的所有"实例"都升级到最新版本(保存活动会话AJAX调用).

然而,作为iOS开发人员,我非常习惯于if在代码中阻止处理不同的数据版本和客户端应用程序版本.这很痛苦(但需要).

我希望能够说"我会神奇地想到版本1.0中的完美数据结构",但我们可能都知道这不是真的 - 我会随着时间的推移添加和弃用属性甚至模型.

我不想将所有版本控制逻辑与我的普通HTML混合(可以优雅地升级,如上所述),所以我想到了:

  • 从iOS获得一个单独的控制器或仅用于我的API调用的操作
  • 编写一个"转发器",将HTML/Web版本视为API版本之上的一个层

我想解决一个解决的问题吗?在进行这个项目时,我应该知道任何资源或指导原则吗?

api json ruby-on-rails ios

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