Tag: objective c

在子类中覆盖init

在Objective-C中,是否有必要重写一个子类的所有inheritance构造函数来添加自定义的初始化逻辑? 例如,对于具有自定义初始化逻辑的UIView子类,以下是否正确? @implementation CustomUIView – (id)init { self = [super init]; if (self) { [self initHelper]; } return self; } – (id)initWithFrame:(CGRect)theFrame { self = [super initWithFrame:theFrame]; if (self) { [self initHelper]; } return self; } – (id)initWithCoder:(NSCoder *)decoder { self = [super initWithCoder:decoder]; if (self) { [self initHelper]; } return self; } – (void) […]

当调用reloadRowsAtIndexPaths时,UITableView弹回到一节的顶部

当用户点击我的行中的一个button时,我正在更新该行的基础模型,然后为给定行(即单行重新加载)调用reloadRowsAtIndexPaths。 – (IBAction)handleCompleteTouchEvent:(UIButton *)sender { NSIndexPath *indexPath = [self.tableView indexPathForView:sender]; id item = [self dataForIndexPath:indexPath]; if ([item respondsToSelector:@selector(completed)]) { // toogle completed value BOOL completed = ![[item valueForKey:@"completed"] boolValue]; [item setValue:[NSNumber numberWithBool:completed] forKey:@"completed"]; [self.tableView beginUpdates]; [self.tableView reloadRowsAtIndexPaths:@[indexPath] withRowAnimation:UITableViewRowAnimationNone]; [self.tableView endUpdates]; } } 问题是在进行这个调用之后,表格视图会跳回到部分的顶部。 我怎样才能防止这种情况发生,并保持滚动的位置?

locking一个对象被多个线程访问 – Objective-C

在Objective-C中,我有一个关于线程安全性的问题。 我已经阅读了一些其他的答案,一些苹果的文档,并仍然有一些怀疑,所以想我会问自己的问题。 我的问题是三重 : 假设我有一个数组, NSMutableArray *myAwesomeArray; 折叠1: 现在纠正我,如果我错了,但从我的理解,使用@synchronized(myAwesomeArray){…}将阻止两个线程访问相同的代码块。 所以,基本上,如果我有这样的东西: -(void)doSomething { @synchronized(myAwesomeArray) { //some read/write operation on myAwesomeArray } } 那么,如果两个线程同时访问同一个方法,那么这个代码块将是线程安全的。 我猜我已经正确地理解了这个部分。 折叠2: 如果myAwesomeArray被来自不同方法的多个线程访问,我该怎么办? 如果我有这样的东西: – (void)readFromArrayAccessedByThreadOne { //thread 1 reads from myAwesomeArray } – (void)writeToArrayAccessedByThreadTwo { //thread 2 writes to myAwesomeArray } 现在,两个方法同时被两个不同的线程访问。 我如何确保myAwesomeArray不会有问题? 我使用类似NSLock或NSRecursiveLock? 折3: 现在,在上述两种情况下, myAwesomeArray是内存中的一个iVar。 如果我有一个数据库文件,我不会一直保存在内存中。 每当我想执行数据库操作时,我都会创build一个databaseManagerInstance ,并在完成后释放它。 因此,基本上,不同的类可以访问数据库。 每个类创build自己的DatabaseManger实例,但基本上它们都使用相同的单个数据库文件。 […]

Objective-C enumerateUsingBlock vs快速枚举?

以下两种方法的优缺点是什么: enumerateUsingBlock NSArray *myArray = [[NSArray alloc] init]; [myArray enumerateObjectsUsingBlock:^(id anObject, NSUInteger idx, BOOL *stop) { if (anObject == someOtherObject) { [anObject doSomething:idx]; *stop = YES; } }]; 快速枚举 NSArray *myArray = [[NSArray alloc] init]; int idx = 0 for (id anObject in myArray) { if (anObject == someOtherObject) { [anObject doSomething:idx]; break; } ++idx; […]

iphone:是否可以隐藏TabBar? (Pre-iOS 8)

我有一个应用程序使用UITabBarController切换模式。 在某种模式下,我想隐藏标签栏,直到该模式的步骤已经完成。 请注意,我没有使用导航控制器,因此我无法使用导航控制器上的setHidesBottomBarWhenPushed方法来隐藏选项卡栏。 在iOS 8之前,当我尝试使用以下命令来隐藏tarbar: self.tabBarController.tabBar.hidden = YES 标签栏消失,但在标签栏所在的屏幕底部会留下50像素的空白区域。 我似乎无法弄清楚如何填补这个领域。 UI中的任何内容都被剪切掉,无法看到。 任何想法,如果这是可能的? 我真的很想远离导航控制器。

如何读取Objective-C栈跟踪

我有以下堆栈跟踪: 0 MyApp 0x000833a3 +[TFCrashHandler backtrace] + 26 1 MyApp 0x000836bd TFSignalHandler + 28 2 libsystem_c.dylib 0x33eac727 _sigtramp + 34 3 ??? 0x00000002 0x0 + 2 4 MyApp 0x000803f1 msgpack_unpack_next + 112 5 MyApp 0x0007faeb +[MessagePackParser parseData:] + 74 6 MyApp 0x0007f84b -[NSData(NSData_MessagePack) messagePackParse] + 26 7 MyApp 0x000254c3 +[Http get:params:cacheMins:msgPack:complete:] + 146 … 我想知道如何读取它: […]

如何使用格式化占位符本地化string?

我如何使用NSLocalizedString本地化一个包含占位符的string? 例如: [NSString stringWithFormat:@"You can afford %i at %@%li.",[kCash integerValue]/self.price, kYen, self.price] 我如何本地化? 我是否将string分解为多个本地化的string? 那么我怎么处理不同的句子结构和语法呢?

Objective-C中的NS_BLOCK_ASSERTIONS

我正在iPhone应用程序中使用NSAssert()调用,我从Apple文档中了解到,如果定义了NS_BLOCK_ASSERTIONS,则断言不会编译到代码中。 要closures声明,在头文件中我声明:#define NS_BLOCK_ASSERTIONS 但是,assert代码似乎仍然运行。 有什么我在这里失踪? 谢谢 约翰

在ARC之后,我应该使用哪个属性来发送调度队列?

我维护一个调度队列作为一个属性与我的视图控制器。 我在我的视图控制器的init方法中创build了一个这个队列,并为一些后台任务重复使用了几次。 在ARC之前,我是这么做的: @property (nonatomic, assign) dispatch_queue_t filterMainQueue; 在init中: if (filterMainQueue == nil) { filterMainQueue = dispatch_queue_create("com.myQueue.CJFilterMainQueue", NULL); } 但是在ARC之后,我不确定这是否应该“分配”,还是应该是“强”还是“弱”。 ARC转换器的脚本没有改变任何东西,但是我不确定这个队列是否可以在使用的时候释放一个细微的错误。 使用ARC时,3种属性之间的区别是什么?对于调度队列,最有效的是什么?

目标C – 用ARC定制setter?

以下是我以前如何编写自定义保留的 setter: – (void)setMyObject:(MyObject *)anObject { [_myObject release], _myObject = nil; _myObject = [anObject retain]; // Other stuff } 当属性设置为强时,如何使用ARC来实现这一点。 我怎样才能确保variables有强大的指针?