我正在努力完成这个难题.
__strong是所有Objective-C可保留对象指针的默认值,如NSObject,NSString等.这是一个强大的参考.ARC -release在范围的末尾与a平衡.
__unsafe_unretained等于旧的方式.它用于弱指针而不保留可保留对象.
__weak就像__unsafe_unretained不同之处在于它是一个自动归零弱引用这意味着该指针将零一旦引用的对象被释放被设置为.这消除了悬空指针和EXC_BAD_ACCESS错误的危险.
但到底有什么__autoreleasing好处呢?我很难找到关于何时需要使用此限定符的实际示例.我相信它只适用于期望指针指针的函数和方法,例如:
- (BOOL)save:(NSError**);
Run Code Online (Sandbox Code Playgroud)
要么
NSError *error = nil;
[database save:&error];
Run Code Online (Sandbox Code Playgroud)
在ARC下必须以这种方式声明:
- (BOOL)save:(NSError* __autoreleasing *);
Run Code Online (Sandbox Code Playgroud)
但这太模糊了,我想完全理解为什么.我找到的代码片段将__autoreleasing放在两颗星之间,这对我来说很奇怪.类型是NSError**(一个指针指向NSError),那么为什么要放在__autoreleasing星星之间而不是简单地放在前面NSError**呢?
此外,可能还有其他必须依赖的情况__autoreleasing.
当使用时解除模态视图控制器时dismissViewController,可以选择提供完成块.是否有相似的等价物popViewController?
完成论证非常方便.例如,我可以使用它来阻止从tableview中删除一行,直到模态关闭屏幕,让用户看到行动画.从推出的视图控制器返回时,我想要同样的机会.
我已经尝试放置popViewController一个UIView动画块,我可以访问完成块.但是,这会对弹出的视图产生一些不必要的副作用.
如果没有这样的方法,有什么办法吗?
我的应用程序适用于iOS 5.1,但对于iOS 6模拟器,我收到以下错误.
由于未捕获的异常'NSInternalInconsistencyException'终止应用程序,原因:' - [UITableViewController loadView]加载了"MainListViewController"笔尖,但没有得到UITableView.
我是子类UITableViewController,我不想改变它.
tableview是以编程方式创建的,有一个虚拟MainListViewController.xib加载来自Mainwindow.xibTab Bar Controller.
我也尝试删除MainListViewController.xib,从MainWindow.xibTab Bar Controller中删除它,MainListViewController在AppDelegate中创建它并将其添加到Tab Bar Controller UITabBarItem以摆脱这个nib问题,但我仍然得到同样的错误.
我正在努力准确地理解点大小的UIFont含义.它不是像素,它似乎不是点的标准定义,它们与1/72英寸相关.
我使用-[NSString sizeWithFont:]各种大小的字体计算出像素大小,并得到以下结果:
| Point Size | Pixel Size |
| ---------- | ---------- |
| 10.0 | 13.0 |
| 20.0 | 24.0 |
| 30.0 | 36.0 |
| 40.0 | 47.0 |
| 50.0 | 59.0 |
| 72.0 | 84.0 |
| 99.0 | 115.0 |
| 100.0 | 116.0 |
Run Code Online (Sandbox Code Playgroud)
(我做了[@"A" sizeWithFont:[UIFont systemFontOfSize:theSize]])
并且72.0看点大小,这不是1英寸,因为这是在DPI为163的设备上,所以1英寸将是163.0像素,对吧?
任何人都可以用UIFont术语解释什么是"点" ?即我的方法是错误的,如果我使用别的东西,我会看到有关字体的东西是72点的163像素?或者纯粹是从其他东西定义一个点?
我经常不得不应对在iOS应用程序设计中过期的会话/访问令牌,并且从未真正找到我100%舒适的设计,所以我在这里问这里是否有人能想出更好的设计比我目前使用的.
您有一个使用用户名和密码登录的应用程序.服务器返回一个访问令牌,该令牌应该用于将来对该用户进行身份验证的请求.在将来的某个时间点(未知时间),服务器将使该令牌到期,并且使用该令牌发送的任何请求都将返回身份验证失败.
由于会话过期而导致失败,应用程序应使用原始凭据重新登录并获取新的访问令牌.然后它可以重试原始请求.
因此,假设您有一个API来获取需要身份验证的新闻文章列表.流程可能如下:
现在想象一下,这是从应用程序中的多个位置完成的.
我通常做的是存储凭证NSUserDefaults(如果我不关心那些凭证的安全性 - 显然更好地使用密钥链)然后在全局管理器对象(单例)上有一个方法,当使用这些凭据刷新登录时我注意到会话已过期.当登录状态发生变化时,此全局管理器会触发通知,以便应用程序的其他部分可以知道何时由于会话过期而应该在失败后重试请求.
好吧,我从来没有喜欢过经理对象的状态机处理.执行请求的每个位置都需要保存一些状态才能知道登录刷新正在进行,并在刷新登录后重试请求.还有一个问题,如果刷新因为密码错误而导致该怎么办(用户可能更改了它) - 你可能不想完全注销并破坏应用程序的所有用户状态,因为你可能只是能够像以前一样要求新密码并继续进行.但是全局管理器并没有真正与UI相关联,因此很难处理要求新登录的UI.
我知道这个问题特别模糊和概念化(我仍然认为可以在StackOverflow上工作吗?)但我真的只想知道其他人如何解决这类问题.只是解释您如何处理会话过期,重试来自整个应用程序的失败请求,并在刷新不起作用时向用户询问新凭据.
我想整件事的关键是这个问题:
在何处放置由于会话到期而失败的请求的重试逻辑.我看到这些地方是可选的:
refreshLogin,一旦刷新登录,可能会在调用时执行一个块).InputStream myInput = myContext.getAssets().open("MyFolder/" + "MyFile.db3");
Run Code Online (Sandbox Code Playgroud)
如上所述,我在子文件夹的assets文件夹中有一个文件.它没有获取文件,是否有一种特殊的方法来指定assets文件夹中的子文件夹?
伊恩
我在iPhone 4上发生了崩溃,其异常类型为EXC_GUARD.我无法通过谷歌(只有1个结果)或在stackoverflow上找到有关此特定异常的任何信息.它是什么?
Version: ??? (???)
Code Type: ARM (Native)
Parent Process: launchd [1]
Date/Time: 2012-10-24 14:29:53.740 -0700
OS Version: iOS 6.0 (10A403)
Report Version: 104
Exception Type: EXC_GUARD
Exception Codes: 0x0000000100000010, 0x08fd4dbfade2dead
Crashed Thread: 0
Thread 0 name: MAIN Dispatch queue: com.apple.main-thread
Thread 0 Crashed:
0 libsystem_kernel.dylib 0x32f25294 close + 8
1 Twine 0x00230b8e close_file + 10
2 Twine 0x00218774 -[TFAirTrafficController startSession] + 752
3 Twine 0x002169fa +[TestFlight takeOff:] + 122
Run Code Online (Sandbox Code Playgroud) 我有点困惑为什么clang为以下两种方法发出不同的代码:
@interface ClassA : NSObject
@end
@implementation ClassA
+ (ClassA*)giveMeAnObject1 {
return [[ClassA alloc] init];
}
+ (id)giveMeAnObject2 {
return [[ClassA alloc] init];
}
@end
Run Code Online (Sandbox Code Playgroud)
如果我们查看发出的ARMv7,那么我们会在O3启用ARC的情况下看到这个:
.align 2
.code 16
.thumb_func "+[ClassA giveMeAnObject1]"
"+[ClassA giveMeAnObject1]":
push {r7, lr}
movw r1, :lower16:(L_OBJC_SELECTOR_REFERENCES_-(LPC0_0+4))
mov r7, sp
movt r1, :upper16:(L_OBJC_SELECTOR_REFERENCES_-(LPC0_0+4))
movw r0, :lower16:(L_OBJC_CLASSLIST_REFERENCES_$_-(LPC0_1+4))
movt r0, :upper16:(L_OBJC_CLASSLIST_REFERENCES_$_-(LPC0_1+4))
LPC0_0:
add r1, pc
LPC0_1:
add r0, pc
ldr r1, [r1]
ldr r0, [r0]
blx _objc_msgSend
movw r1, :lower16:(L_OBJC_SELECTOR_REFERENCES_2-(LPC0_2+4))
movt r1, :upper16:(L_OBJC_SELECTOR_REFERENCES_2-(LPC0_2+4))
LPC0_2:
add r1, …Run Code Online (Sandbox Code Playgroud) 我在iOS应用程序中有一个奇怪的问题,有时WAL文件变得很大(~1GB).看来还有其他人有问题(例如,当插入~5000行时,Core Data sqlite-wal文件获得MASSIVE(> 7GB)).
我最初的想法是在应用程序启动时删除WAL文件.从阅读关于此事的sqlite文档来看,这似乎没问题.但有人知道这样做的任何缺点吗?
我当然希望深入了解为什么WAL文件增长如此之大,但我现在无法深入了解它并希望在深入研究问题的同时加入解决方案.
值得指出的是,我的Core Data数据库更像是一个缓存.因此,如果我丢失了WAL中的数据并不重要.我真正需要知道的是,如果删除WAL,数据库是否会完全损坏?我的怀疑是否定的,否则WAL不能达到其目的之一.